gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:51:06 29 4
gpt4 key购买 nike

我已经看到帖子 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不是动态数组,它是开放数组参数。因此,您需要声明您的函数也使用开放数组。

顺便说一句,在我看来印地人搞砸了 TUDPReadEvent 的声明。 AData参数确实应该作为 const 传递. 请参阅 Remy 的评论:是 Emba 搞砸了。

您应该阅读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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com