Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE3 indy在tbytes和tidbytes之间的兼容性问题_Delphi_Bytearray_Indy_Delphi Xe3_Indy10 - Fatal编程技术网

Delphi XE3 indy在tbytes和tidbytes之间的兼容性问题

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没有可以使用这些参

我已经在邮局看到了 关于数据类型tbytes和tidbytes之间的兼容性问题。 从我学到的第二个答案中,看起来它们不能一起使用,即使它们都是字节数组。 然而,最新的答案是,在indy 10.5.9中,它取决于T字节的存在,只有在indy 10.6中,它才完全作为字节数组提交。 无论如何,我有一个.pas单元,它解码IdUDPServerUDPRead事件中的几个数据包,但无法将它们组合在一起。 我总是会出错: [dcc32 Error]Unit1.pas(216):E2250没有可以使用这些参数调用的重载版本的“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到实际可用的变量,以便将其放入解包函数的参数列表中

任何帮助都将不胜感激

谢谢


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之外,什么情况会导致你不使用开放数组作为参数