如何获得 PByteArray 的正确元素总数?

How get correct total number of elements of a PByteArray?

在下面的代码中,我正在尝试将二进制文件转换为 Delphi 中对应的字节表示形式。 我很难获得正确的数组元素总数(声明为 PByteArray),而这个 returns 是有限的数量(32767),就像已经讨论过的 here。那么是否存在实现它的替代方法?

这是代码:

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.

指向您分配的数组的指针不包含长度信息。您不能查询该指针以获取数组的长度。相反,您需要修改 File2ByteArray 以便它 returns 除了指针之外的那个长度。

我们看不到 PByteArray 是什么类型,但我通常希望看到 PByte 用于表示指向字节数组的指针。

还值得注意的是,您的代码泄漏了数组。我会通过返回 TBytes 动态数组而不是手动分配的数组来解决这个问题,并解决长度问题。