- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经看到帖子 Delphi XE4 Indy compatibility issue between TBytes and TidBytes关于数据类型 tbytes 和 tidbytes 之间的兼容性问题。从我了解到的第二个答案中,看起来它们不能一起使用,即使它们都是字节数组。然而,最新的答案说,在 indy 10.5.9 中它依赖于 TBytes 的存在,并且只有在 Indy 10.6 中它才完全作为字节数组提交。不管怎样,我有一个 .pas 单元,它可以解码 IdUDPServerUDPRead 事件中的多个数据包,但无法将它们组合在一起。我总是收到错误:[dcc32 错误] Unit1.pas(216): E2250 没有可以使用这些参数调用的“Unpack”的重载版本
但是 Unpack 声明正确:
class function Unpack(Bytes: TBytes; Count: Integer): TOSCPacket; overload;
class function Unpack(Bytes: TBytes; Offset, Count: Integer; TimeTag: Extended
= 0): TOSCPacket; overload; virtual;
据我所知,我对它的用法也是如此:
OSCPacket.Unpack(AData, Length(Adata));
其中 AData 是字节数组。
我在这里做错了什么,我没有看到?我已经在谷歌上搜索了几个小时,但找不到一种方法将 AData 中的数据合并、转换、复制、移动或其他任何方式到实际可用的变量中,以便将其放入 Unpack 函数的参数列表中。
任何帮助将不胜感激。
谢谢
马克S
最佳答案
两个Unpack
方法接收 TBytes
类型的参数。因此您需要传递该类型的变量。您正在传递 array of Byte
类型的变量这与 TBytes
的分配不兼容。
通过将变量声明为 TBytes
来解决问题而不是array of Byte
.
Delphi 中的类型兼容性有点困惑。就我个人而言,我总是使用通用动态数组,它更放宽兼容性规则。所以我会选择使用TArray<Byte>
而不是TBytes
如果我能控制所有涉及的代码。
您的另一个选择是使用开放数组,这是最灵活的参数。例如。
class function Unpack(const Bytes: array of Byte; Count: Integer): TOSCPacket;
该函数可以传递 TBytes
类型的变量, TIdBytes
, array of Byte
, TArray<Byte>
、开放数组构造函数、静态字节数组等
请注意,您还应该将数组参数声明为 const
以避免复制它们的开销。
更新1
很明显 AData
实际上是一个开放数组,而不是动态数组。在这种情况下,您应该让您的函数接收开放数组。
我认为您的代码正在 TUDPReadEvent
类型的方法内执行:
type
TUDPReadEvent = procedure(AThread: TIdUDPListenerThread; AData: array of Byte;
ABinding: TIdSocketHandle) of object;
在这种情况下TIdBytes
不相关,这里没有这种类型的东西。和AData
不是动态数组,它是开放数组参数。因此,您需要声明您的函数也使用开放数组。
顺便说一句,在我看来印地人搞砸了
请参阅 Remy 的评论:是 Emba 搞砸了。TUDPReadEvent
的声明。
AData
参数确实应该作为
const
传递.
您应该阅读documentation of open array parameters以确保您完全理解开放数组参数和动态数组之间的区别。
更新2
如果您无法修改这些接口(interface)中的任何一个,那么您只需在它们之间放置一个适配器即可。例如:
function CopyBytes(const Bytes: array of Byte): TBytes;
var
Count: Integer;
begin
Count := Length(Bytes);
SetLength(Result, Count);
if Count > 0 then
Move(Bytes[0], Result[0], Length(Bytes));
end;
关于Delphi XE3 indy tbytes 和 tidbytes 之间的兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19402374/
我目前正在按照 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 具有相同的限
我是一名优秀的程序员,十分优秀!