将TArray分配给T数组

r_j*_*r_j 2 arrays delphi generics

如何指定一个TArray<Byte>,array of Byte反之亦然?

TEncoding.UTF8.GetBytes返回一个TArray<Byte>.TIdHashMessageDigest5.HashBytes有一个TIdBytes = array of Byteas参数.

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

Dav*_*nan 6

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

如果你不能,那么你可以复制.这很简单,循环.如果效率很重要,您可以使用Move.

SetLength(Dest, Length(Source));
Move(Pointer(Source)^, Pointer(Dest)^, Length(Source));
Run Code Online (Sandbox Code Playgroud)

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

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

Hash := HashBytes(TIdBytes(TEncoding.UTF8.GetBytes(...)));
Run Code Online (Sandbox Code Playgroud)

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

雷米对另一个问题的回答建议的另一种方法是使用TIdTextEncoding而不是TEncoding.这样你就可以TIdBytes独家工作.

  • @ penarthur66`TIdBytes`可以很容易地通过条件定义来解决这个问题. (2认同)
  • @ penarthur66实际上,`TIdBytes`曾经是`TBytes`别名可用的(这是`在tarray <字节>`当可用的别名),但这样做引起了很多问题,尤其是在横跨多个事件处理程序时Delphi/C++边界(Embarcadero RTTI bug).所以最终我别无选择,只能让`TIdBytes`回到使用'Byte`数组来维持正常的功能.它不是处理向后兼容性,而是处理Embarcadero错误. (2认同)