如何将TArray<Byte>
分配给array of Byte
,反之亦然?
TEncoding.UTF8.GetBytes
返回TArray<Byte>
。 TIdHashMessageDigest5.HashBytes
的参数为TIdBytes = array of Byte
。
我可以将这些类型分配给对方吗?也许有副本?或者我需要循环吗?
答案 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
。