如何将TArray<Byte>分配给array of Byte,反之亦然?
TEncoding.UTF8.GetBytes返回一个TArray<Byte>TIdHashMessageDigest5.HashBytesTIdBytes = array of Byte作为参数。

我可以互相分配这些类型吗?也许有副本?还是我需要循环?

最佳答案

这些类型与分配不兼容。在理想的情况下,您将只使用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

10-08 00:04