- 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/
抱歉,如果我的问题很愚蠢! 我正在使用 Delphi XE4,现在正在开发 IdTelnet。但我遇到了 OnDataAvailable 事件的问题。看看这张图片: 所以我无法使用 OnDataAva
我遇到了与“Delphi XE4 Indy compatibility issue between TBytes and TidBytes”中提到的相同问题,即使用Delphi XE4编译时TByte
今天我尝试在 XE4 中编译我的 XE3 项目。我面临的第一个问题是 Indy 的 FTCPClient.Socket.ReadBytes() 方法。 之前它接受 TBytes 类型,现在它坚持使用
我已经看到帖子 Delphi XE4 Indy compatibility issue between TBytes and TidBytes关于数据类型 tbytes 和 tidbytes 之间的兼
如何将 TIdBytes 编码为 Base64 字符串(不是 AnsiString)? ASocket.IOHandler.CheckForDataOnSource(5); if not AS
我是一名优秀的程序员,十分优秀!