给定一个缓冲区和它的字节数大小,有没有办法将它转换成TBytes而不需要复制它?
例子:
procedure HandleBuffer(_Buffer: PByte; _BufSize: integer);
var
Arr: TBytes;
i: Integer;
begin
// some clever code here to get contents of the buffer into the Array
for i := 0 to Length(Arr)-1 do begin
HandleByte(Arr[i]);
end;
end;
当然,我可以复制这些数据:
procedure HandleBuffer(_Buffer: PByte; _BufSize: integer);
var
Arr: TBytes;
i: Integer;
begin
// this works but is very inefficient
SetLength(Arr, _BufSize);
Move(PByte(_Buffer)^, Arr[0], _BufSize);
//
for i := 0 to Length(Arr)-1 do begin
HandleByte(Arr[i]);
end;
end;
但对于一个大Buffer(约一百兆字节),这意味着我需要双倍内存,而且还要花费大量时间不必要地复制数据。
我知道我可以简单地使用PByte来处理缓冲区中的每个字节,但我只想使用TBytes的解决方案。
我认为这是不可能的,但我以前也说错过。
property Items[index: Integer]: Byte
,其中包含内联Getter,您可以在其中进行范围检查。 - Stefan Glienke