Delphi XE3 indy在tbytes和tidbytes之间的兼容性问题
我已经在邮局看到了 关于数据类型tbytes和tidbytes之间的兼容性问题。 从我学到的第二个答案中,看起来它们不能一起使用,即使它们都是字节数组。 然而,最新的答案是,在indy 10.5.9中,它取决于T字节的存在,只有在indy 10.6中,它才完全作为字节数组提交。 无论如何,我有一个.pas单元,它解码IdUDPServerUDPRead事件中的几个数据包,但无法将它们组合在一起。 我总是会出错: [dcc32 Error]Unit1.pas(216):E2250没有可以使用这些参数调用的重载版本的“Unpack” 但解包声明正确:Delphi XE3 indy在tbytes和tidbytes之间的兼容性问题,delphi,bytearray,indy,delphi-xe3,indy10,Delphi,Bytearray,Indy,Delphi Xe3,Indy10,我已经在邮局看到了 关于数据类型tbytes和tidbytes之间的兼容性问题。 从我学到的第二个答案中,看起来它们不能一起使用,即使它们都是字节数组。 然而,最新的答案是,在indy 10.5.9中,它取决于T字节的存在,只有在indy 10.6中,它才完全作为字节数组提交。 无论如何,我有一个.pas单元,它解码IdUDPServerUDPRead事件中的几个数据包,但无法将它们组合在一起。 我总是会出错: [dcc32 Error]Unit1.pas(216):E2250没有可以使用这些参
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到实际可用的变量,以便将其放入解包函数的参数列表中
任何帮助都将不胜感激
谢谢
MarcS这两个
解包方法接收类型为TBytes
的参数。因此,您需要传递该类型的变量。您传递的变量类型为字节数组
,与TBytes
赋值不兼容
通过将变量声明为TBytes
而不是字节数组来解决此问题
Delphi中的类型兼容性有点混乱。就我个人而言,我总是使用通用的动态数组,它具有更多的松弛兼容性规则。因此,如果我控制所有涉及的代码,我会选择使用TArray
而不是TBytes
另一种选择是使用开放数组,这是最灵活的参数。比如说
class function Unpack(const Bytes: array of Byte; Count: Integer): TOSCPacket;
该函数可以传递类型为TBytes
,TIdBytes
,字节数组
,TArray
,开放数组构造函数,静态字节数组等的变量
请注意,还应将数组参数声明为const
,以避免复制它们的开销
更新1
显然,AData
实际上是一个开放数组,而不是一个动态数组。在这种情况下,应该使函数接收开放数组
我认为您的代码是在类型为tudpredevent
的方法中执行的:
type
TUDPReadEvent = procedure(AThread: TIdUDPListenerThread; AData: array of Byte;
ABinding: TIdSocketHandle) of object;
在这种情况下,TIdBytes
是不相关的,这里没有这种类型的内容。而AData
不是一个动态数组,它是一个开放数组参数。因此,还需要声明函数以使用开放数组
另一方面,在我看来,印地安人在《图德发展宣言》中把事情搞砸了。AData
参数实际上应该作为const
传递。看雷米的评论:是Emba把事情搞砸了
您应该阅读以确保完全理解开放数组参数和动态数组之间的区别
更新2
如果您不能修改这些接口中的任何一个,那么您必须在它们之间放置一个适配器。例如:
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;
两个Unpack
方法接收类型为TBytes
的参数。因此,您需要传递该类型的变量。您传递的变量类型为字节数组
,与TBytes
赋值不兼容
通过将变量声明为TBytes
而不是字节数组来解决此问题
Delphi中的类型兼容性有点混乱。就我个人而言,我总是使用通用的动态数组,它具有更多的松弛兼容性规则。因此,如果我控制所有涉及的代码,我会选择使用TArray
而不是TBytes
另一种选择是使用开放数组,这是最灵活的参数。比如说
class function Unpack(const Bytes: array of Byte; Count: Integer): TOSCPacket;
该函数可以传递类型为TBytes
,TIdBytes
,字节数组
,TArray
,开放数组构造函数,静态字节数组等的变量
请注意,还应将数组参数声明为const
,以避免复制它们的开销
更新1
显然,AData
实际上是一个开放数组,而不是一个动态数组。在这种情况下,应该使函数接收开放数组
我认为您的代码是在类型为tudpredevent
的方法中执行的:
type
TUDPReadEvent = procedure(AThread: TIdUDPListenerThread; AData: array of Byte;
ABinding: TIdSocketHandle) of object;
在这种情况下,TIdBytes
是不相关的,这里没有这种类型的内容。而AData
不是一个动态数组,它是一个开放数组参数。因此,还需要声明函数以使用开放数组
另一方面,在我看来,印地安人在《图德发展宣言》中把事情搞砸了。AData
参数实际上应该作为const
传递。看雷米的评论:是Emba把事情搞砸了
您应该阅读以确保完全理解开放数组参数和动态数组之间的区别
更新2
如果您不能修改这些接口中的任何一个,那么您必须在它们之间放置一个适配器。例如:
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;
这里的问题是,我没有将变量声明为字节数组。印地是这样。indy在读取过程中传递的是AData变量:IdUDPServerUDPRead(AThread:TIdUDPListenerThread;AData:Byte数组;ABinding:TIdSocketHandle);那么,我怎样才能掩盖这一点,或者怎样才能解决这个问题呢/使用开放数组。这就是AData
的含义。这在你的问题中并不清楚。+1,除了wh之外,什么情况会导致你不使用开放数组作为参数