7

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

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

在我看来,有两种方法:

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

  2. 实现 TBytesToTidBytes 转换过程(将 TBytes 转换为 TIdBytes)并在进行上述本机 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;
4

2 回答 2

7

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

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;
于 2013-09-17T15:51:15.507 回答
1

在较新的 Delphi 版本中,这两种类型在实现级别上并不相同(在最近的 Delphi 版本中TBytes是一个简单的别名)。TArray<Byte>

所以我想你可以使用这样的程序:

procedure TBytesToTIdBytes(const Input: TBytes; var Output: TIdBytes);
var L: integer;
begin
  L := Length(Input);
  SetLength(Output,L);
  move(Input[0],Output[0],L);
end;

这里move()比循环快。

于 2013-09-17T15:37:07.160 回答