Приветствую всех! Задача: найти в бинарном файле последовательность байт и скопировать часть данных в массив из байт (длина разная). Нашёл в сети пример, где файл маппится в память, а затем все манипуляции происходят в памяти:
| Код | program test; {$O-} {$APPTYPE CONSOLE} uses SysUtils, Windows; const match: array[0..2] of byte = ($01,$00,$00); type TByteArray = array of Byte; var hFile: THandle; dwFSize: DWord; hMap: THandle; p: PByteArray; bArray: TByteArray; i: Integer; begin hfile := 0; hMap := 0;
hFile := FileOpen('E:\tmp\test.bin', fmOpenRead); if hFile = INVALID_HANDLE_VALUE then begin raise Exception.Create('Failed to open file!'); end;
try dwFSize := GetFileSize(hFile, nil); hMap := CreateFileMapping( hFile, nil, PAGE_READONLY, 0, 0, nil); if hMap = 0 then begin raise Exception.Create('Failed to create file mapping!'); end; finally CloseHandle(hFile); end;
try p := MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0); if p = nil then begin raise Exception.Create('Failed to map view of file!'); end; finally CloseHandle(hMap); end;
try {поиск} WriteLn('dwFSize: ' + IntToHex(dwFSize,2)); for i := 0 to dwFSize - sizeOf(match) do begin if CompareMem(@p^[i], @match, Length(match)) then begin WriteLn('addr: ' + IntToHex(i,2)); SetLength(bArray, 10); // Тут возникает ошибка Move(p^, bArray, 10); //WriteLn(ArrayToStr(bArray)); end; end; finally SetLength(bArray, 0); UnMapViewOfFile(p); end; end.
|
Почему в 58 строке, после Move возникает ошибка (приложение крашится): Exception EAccessViolation? |