根据 Marco 在这个线程中的建议,我有一个原始字节数据缓冲区,4096 字节,从文件循环读取。
然后我想在该缓冲区中搜索一个已知的 4 个字节的十六进制字符串。我有以下代码可以编译,我知道缓冲区中有数据字节,包括我寻找的十六进制字符串,但 IndexDWord 总是返回 false (-1),我不明白为什么。奇怪的“读取然后再次读取”行为是因为我需要两个单独的缓冲区——一个包含原始字节数据,一个包含字符数据。
var
Buffer : array [1..4096] of char;
Buffer2 : array [1..4096] of byte;
const BinaryMarker : DWord = ($54435054); // (instead of Hex, Hex, Hex, etc. It now compiles)
begin
// Code relating to opening the file etc....then
BytesRead := SourceFile.Read(Buffer, SizeOf(Buffer)); // Read a buffer as an array of chars
SourceFile.Position := SourceFile.Position - BytesRead; // Go back to where you just were
BinaryBytesRead := SourceFile.Read(Buffer2, SizeOf(Buffer2)); // And read it again as byte buffer
J := IndexDWord(Buffer2, SizeOf(Buffer2), BinaryMarker);
if J > 0 then // this is never true, even though I know the byte hex pattern exists in the buffer
ShowMessage('Found at offset ' + IntToStr(J));
end;
帮助!我正在使用 FPC 2.7.1 和 Lazarus 1.1。IndexDWord 的页面在这里