您已經在正確的軌道上用流式命令讀取文件。然而,你爲什麼要讀取文本流?您可以使用tagGroup對象作爲TagGroupReadTagDataFromStream()
的代理將該流讀取爲任何(支持)編號。
F1幫助部分中實際上有一個例子,其中列出了流式命令,我只是在這裏複製。
![F1 help](https://i.stack.imgur.com/ZVZbO.jpg)
Object stream = NewStreamFromBuffer(NewMemoryBuffer(256))
TagGroup tg = NewTagGroup();
Number stream_byte_order = 1; // 1 == bigendian, 2 == littleendian
Number v_uint32_0, v_uint32_1, v_sint32_0, v_uint16_0, v_uint16_1
// Create the tags and initialize with default values
tg.TagGroupSetTagAsUInt32("UInt32_0", 0)
tg.TagGroupSetTagAsUInt32("UInt32_1", 0)
tg.TagGroupSetTagAsLong("SInt32_0", 0)
tg.TagGroupSetTagAsUInt16("UInt16_0", 0)
tg.TagGroupSetTagAsUInt16("UInt16_1", 0)
// Stream the data into the tags
TagGroupReadTagDataFromStream(tg, "UInt32_0", stream, stream_byte_order);
TagGroupReadTagDataFromStream(tg, "UInt32_1", stream, stream_byte_order);
TagGroupReadTagDataFromStream(tg, "SInt32_0", stream, stream_byte_order);
TagGroupReadTagDataFromStream(tg, "UInt16_0", stream, stream_byte_order);
TagGroupReadTagDataFromStream(tg, "UInt16_1", stream, stream_byte_order);
// Show the taggroup, if you want
// tg.TagGroupOpenBrowserWindow("AuxTags",0)
// Get the data from the tags
tg.TagGroupGetTagAsUInt32("UInt32_0", v_uint32_0)
tg.TagGroupGetTagAsUInt32("UInt32_1", v_uint32_1)
tg.TagGroupGetTagAsLong("Sint32_0", v_sint32_0)
tg.TagGroupGetTagAsUInt16("UInt16_0", v_uint16_0)
tg.TagGroupGetTagAsUInt16("UInt16_1", v_uint16_1)
已經有一個帖子在這裏現場有關搜索流中的模式:Find a pattern image (binary file) 這表明你將如何使用流的圖像中的樣子,但你可以使用文件流當然直接。
作爲替代方案,可以預先準備一個合適的圖像讀取後從流中整個陣列與ImageReadImageDataFromStream
。 然後,您可以使用圖像搜索位置。這將是一個例子:
// Example of reading the first X bytes of a file
// as uInt16 data
image ReadHeaderAsUint16(string filepath, number nBytes)
{
number kEndianness = 0 // Default byte order of the current platform
if (!DoesFileExist(filePath))
Throw("File '" + filePath + "' not found.")
number fileID = OpenFileForReading(filePath)
object fStream = NewStreamFromFileReference(fileID, 1)
if (nBytes > fStream.StreamGetSize())
Throw("File '" + filePath + "' has less than " + nBytes + "bytes.")
image buff := IntegerImage("Header", 2, 0, nBytes/2) // UINT16 array of suitable size
ImageReadImageDataFromStream(buff, fStream, kEndianness)
return buff
}
number FindSignature(image header, image search)
{
// 1D images only
if ( (header.ImageGetNumDimensions() != 1) \
|| (search.ImageGetNumDimensions() != 1))
Throw("Only 1D images supported")
number sx = search.ImageGetDimensionSize(0)
number hx = header.ImageGetDimensionSize(0)
if (hx < sx)
return -1
// Create a mask of possible start locations
number startV = search.getPixel(0, 0)
image mask = (header == startV) ? 1 : 0
// Search all the occurances from the first
number mx, my
while(max(mask, mx, my))
{
if (0 == sum(header[0,mx,1,mx+sx] - search))
return mx
else
mask.SetPixel(mx, 0, 0)
}
return -1
}
// Example
// 1) Load file header as image (up to the size you want)
string path = GetApplicationDirectory("open_save", 0)
number maxHeaderSize = 200
if (!OpenDialog(NULL, "Select file to open", path, path)) Exit(0)
image headerImg := ReadHeaderAsUint16(path, maxHeaderSize )
headerImg.ShowImage()
// 2) define search-header as image
image search := [8]: { 02, 06, 08, 22, 02, 02, 08, 00 }
// MatrixPrint(search)
// 3) search for it in the header
number foundAt = FindSignature(headerImg, search)
if (-1 == foundAt)
Throw("The file header does not contain the search pattern.")
else
OKDialog("Found the search pattern at offset: " + foundAt * 16 + "bytes")
相關(但不重複):https://stackoverflow.com/q/34834197/1302888 – BmyGuest