gpt4 book ai didi

delphi - 我应该如何调整我的代码以实现 TBytes 和 TIdBytes 之间的兼容性?

转载 作者:行者123 更新时间:2023-12-03 15:00:04 28 4
gpt4 key购买 nike

我遇到了与“Delphi XE4 Indy compatibility issue between TBytes and TidBytes”中提到的相同问题,即使用Delphi XE4编译时TBytes(Delphi RTL)和TIdBytes(Indy)数据类型之间的兼容性问题。我的问题的根源在于,代码不完全按照 Indy 的接口(interface),并且在调用 native Indy IO 过程时,某些函数使用 TBytes,而不是 TIdBytes。

所以我想知道最好的解决办法是什么?

据我所知,有两种方法:

  1. 重构项目中的所有函数以使用 TIdBytes 而不是 TBytes。

  2. 实现 TBytesToTidBytes 转换过程(将 TByte 转换为 TIdBytes)并在进行上述 native Indy 调用之前调用该过程。

哪种方法更好/最好?您对我如何做到这一点还有其他想法吗?

仅供引用:我尝试使用 XE4 配置的项目可在 sourceforge 上在线获取:http://sourceforge.net/projects/indy10clieservr/?source=directory

建议的转换过程应该类似于:

procedure TBytesToTIdBytes(const Input:TBytes, var Output: TIdBytes)
var
i,L : Integer;
allocate : Boolean;
begin
L := Length(Input);
if(Length(Output) <> L) then
begin
SetLength(Output,L);
end;
if(L > 0) then
move(Pointer(Input)^,Pointer(Output)^,L);
end;

最佳答案

TBytesTIdBytes 都实现为动态数组,只是声明方式不同。 “政治正确”的解决方案是复制字节。但这可能会浪费大型数组的内存。一个更简单的解决方案是使用类型转换,以便您可以利用数组的内部引用计数,例如:

type
PIdBytes = ^TIdBytes;
var
B1: TBytes;
B2: TIdBytes;
begin
B1 := ...;
B2 := PIdBytes(@B1)^;
end;

或者简单地说:

var
B1: TBytes;
B2: TIdBytes;
begin
B1 := ...;
B2 := TIdBytes(B1);
end;

关于delphi - 我应该如何调整我的代码以实现 TBytes 和 TIdBytes 之间的兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18849053/

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