如何分配 TArray<Byte>
至array of Byte
反之亦然?
TEncoding.UTF8.GetBytes
返回 TArray<Byte>
。 TIdHashMessageDigest5.HashBytes
有一个TIdBytes = 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
独家。
关于arrays - 将 TArray 分配给 T 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41464133/