Как получить правильное общее количество элементов PByteArray? - PullRequest
0 голосов
/ 29 апреля 2020

В следующем коде я пытаюсь преобразовать двоичный файл в соответствующее представление байтов в 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.

1 Ответ

2 голосов
/ 29 апреля 2020

Указатель на массив, выделенный, как вы это сделали, не содержит информации о длине. Вы не можете запросить этот указатель для длины массива. Вместо этого вам нужно изменить File2ByteArray так, чтобы он возвращал эту длину в дополнение к указателю.

Мы не можем видеть, что такое тип PByteArray, но я обычно ожидаю увидеть использованный PByte для представления указателя на массив байтов.

Стоит также отметить, что ваш код пропускает массив. Я решил бы это и решил проблему длины, возвращая массив TBytes dynamici c вместо выделенного вручную массива.

...