arrays - 将 TArray 分配给 T 数组

标签 arrays delphi generics

如何分配 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/

相关文章:

php - 通知: Array to string conversion in "path of php file" on line 64

c# - 在 GetHashCode 实现中处理集合

java - Java 中菱形运算符 (<>) 的作用是什么?

c# - 使用泛型的类型安全 : Check T to Interface<T>

Java:在对象数组上设置变量

sql - Postgres : Group by clause with predefined set of values

php - 使用 PHP 循环后将数组附加到 JSON 输出

delphi - C++ Builder/Delphi 2010 应用程序 list 模板

windows - RAD工作室需要很长时间才能打开

delphi - 在 Delphi 中编译/链接未使用的函数/过程