将TArray分配给T数组

时间:2017-01-04 12:43:07

标签: arrays delphi generics

如何将TArray<Byte>分配给array of Byte,反之亦然?

TEncoding.UTF8.GetBytes返回TArray<Byte>TIdHashMessageDigest5.HashBytes的参数为TIdBytes = array of Byte

我可以将这些类型分配给对方吗?也许有副本?或者我需要循环吗?

1 个答案:

答案 0 :(得分:6)

这些类型不兼容分配。在一个理想的世界中,你只能使用TArray<T>,如果所有的库都这样做会更好。我不明白为什么Indy坚持在这里使用自己独特的类型。

如果你不能,那么你可以复制。这很简单,有一个循环。如果效率很重要,您可以使用Move进行复制。

SetLength(Dest, Length(Source));
Move(Pointer(Source)^, Pointer(Dest)^, Length(Source));

我在这里使用Pointer(arr)^而不是arr[0]来避免在空数组的情况下跳过范围检查异常。

通过使用类型转换也可以避免复制,因为所有动态数组都以相同的方式实现。所以你可以写

Hash := HashBytes(TIdBytes(TEncoding.UTF8.GetBytes(...)));

当然,这会放弃类型安全性,但上面调用Move也是如此。

Remy's answer to another question建议的另一种方法是使用TIdTextEncoding而不是TEncoding。这样您就可以专门使用TIdBytes