- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个缓冲区及其大小(以字节为单位),有没有办法将其转换为 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;
但是对于一个大缓冲区(大约一百兆字节),这意味着我的内存需求增加了一倍,并且还要花费大量时间来不必要地复制数据。
最佳答案
不,这是不可能的(没有不合理的黑客攻击)。
问题是TBytes = TArray<Byte> = array of Byte
是 a dynamic array并且非空动态数组的堆对象具有 a header包含数组的引用计数和长度。
一个接受 TBytes
的函数参数,当给定一个指向字节数组的普通指针时,可能(理所当然地)尝试读取(不存在的) header ,然后您就会遇到严重的麻烦。
此外,动态数组是托管类型(如我提到的引用计数所示),因此您也可能会遇到问题。
但是,在您的特定示例代码中,您实际上根本没有使用数据的动态数组性质,因此您可以直接使用缓冲区:
procedure HandleBuffer(_Buffer: PByte; _BufSize: integer);
var
i: Integer;
begin
for i := 0 to _BufSize - 1 do
HandleByte(_Buffer[i]);
end;
关于delphi - 我可以将缓冲区 + 大小转换为 TBytes 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64353573/
我目前正在按照 Kip Irvine 的“汇编语言 x86 编程”一书学习汇编编程。 在书中,作者说 MASM uses the TBYTE directive to declare packed B
如果我想声明一个静态编译时字节数组,我可以这样做: var bytes :array[0..24] of Byte = (1, 2, 3, .... ); 但是,它的类型是字节数组[0..24],
组合 TBytes 数组的最佳方式是什么? 所有数组的大小相同。我希望将 Array2 的内容添加到 Array1 的末尾,将 Array3 添加到 Array2 的末尾,等等。 最佳答案 要将两个
我使用的是Delphi XE4。我尝试为 TBytes 定义一些辅助函数: TBytesHelper = record helper for TBytes public function GetL
考虑以下 XE6 代码。其目的是应将 ThingData 写入 Thing1 和 Thing2 的控制台,但事实并非如此。这是为什么? program BytesFiddle; {$APPTYPE C
我知道这可能是一个非常简单的问题,但是在masm中,一个TBYTE在十六进制中可以容纳的最大值是多少?我正在 64 位系统上工作。我的教科书说它可以容纳的最大整数是 999,999,999,999,9
这里的重点是优化。 现在: type TSomeClass=class(TObject) private DataWrite: TBytes; ... end; Function TS
首先,我想解释一下为什么我需要这个。我需要为虚拟机创建一些磁盘镜像文件。该文件将非常大(100GB ~ 1.5TB),其中填充了零。它应该在很短的时间内创建(尽可能多,至少应该比带有“/dev/zer
我有这个PCB用 ATMEL-microcontroller通过 TCP 通信 Lantronix Xport .它使用 30 字节长的 asci 字符串发送一些继电器和传感器的状态报告,格式如下:
给定一个缓冲区及其大小(以字节为单位),有没有办法将其转换为 TBytes 而不复制它? 例子: procedure HandleBuffer(_Buffer: PByte; _BufSize: in
在 Delphi 2009 中将声明为 TByte 的字节数组转换为 RawByteString 的最佳方法是什么?这段代码确实有效,也许有更快的方法(无循环): function Conver
如何使用 MemoryStream 将 Tbytes 类型转换为 二进制文件? 最佳答案 或者直接使用TFileStream来减少创建的中间对象的数量: procedure SaveBytesToFi
procedure TForm1.UDPUDPRead(AThread: TIdUDPListenerThread; AData: arra
我有一个 AnsiString我需要以最有效的方式将其转换为 TBytes .我怎样才能做到这一点 ? 最佳答案 函数BytesOf将 AnsiString 转换为 TBytes。 var A:
我正在尝试将 TByte 的值输出为 AnsiString 中相应的十六进制表示形式。 示例:T字节为0x4FAnsiString:“4F”(两个字符,一个 4 和一个 F) 我知道 StringOf
我遇到了与“Delphi XE4 Indy compatibility issue between TBytes and TidBytes”中提到的相同问题,即使用Delphi XE4编译时TByte
鉴于以下情况: LBytes: TBytes; LArr: array[1..512] of Byte; ... SetLength(LBytes, 512); 将所有字节从 LBytes 复制到 L
在 Delphi 2009 中将声明为 TBytes 的字节数组转换为 unicode 字符串的最佳方法是什么?在我的特定情况下,TBytes 数组已经具有 UTF-16 编码数据(每个字符 2 个字
由于 TBytes、TByteDynArray 和 array of Bytes 都是动态字节数组,类型化变量可以安全地相互类型转换吗? (如果我有一个 TBytes 变量,当使用将参数定义为 TBy
这 3 种类型非常相似... TArray 是 TBytes 的通用版本。两者都可以转换为 PByteArray 并用作调用 Windows API 的缓冲区。 (与字符串到 Pchar 具有相同的限
我是一名优秀的程序员,十分优秀!