В следующем коде я пытаюсь преобразовать двоичный файл в соответствующее представление байтов в Delphi. Мне трудно получить правильное общее количество элементов массива (объявлено как PByteArray
), и это возвращает ограниченное число (32767), как уже обсуждалось здесь . Тогда существует ли альтернативный способ добиться этого?
Это код:
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function File2ByteArray(const FileName: string; out ByteArray: PByteArray): Boolean;
var
hFile: HWND;
dwSize, dwRead: DWORD;
begin
Result := False;
hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hFile = INVALID_HANDLE_VALUE then
Exit;
dwSize := GetFileSize(hFile, nil);
ByteArray := AllocMem(dwSize);
ReadFile(hFile, ByteArray^, dwSize, dwRead, nil);
Result := True;
CloseHandle(hFile);
end;
procedure TForm1.btn1Click(Sender: TObject);
var
ByteArray: PByteArray;
MyList: TStringList;
I: Integer;
begin
if File2ByteArray(ParamStr(0), ByteArray) then
begin
try
MyList := TStringList.Create;
MyList.Add('Const');
MyList.Add(' aSize = ' + IntToStr(High(ByteArray^)) + ';');
MyList.Add('stub_: Array [' + IntToStr(Low(ByteArray^)) + ' .. ' + IntToStr(High(ByteArray^) - 1) + '] of Byte =');
MyList.Add('(');
MyList.Add('');
for I := Low(ByteArray^) to High(ByteArray^) - 1 do
MyList.Add('$' + IntToHex(ByteArray[I], 2) + ',');
MyList.Add(');');
MyList.SaveToFile('C:\File2ByteArray.txt');
finally
MyList.Free;
end;
end;
end;
end.