如何获得 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
动态数组而不是手动分配的数组来解决这个问题,并解决长度问题。
在下面的代码中,我正在尝试将二进制文件转换为 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
动态数组而不是手动分配的数组来解决这个问题,并解决长度问题。