gpt4 book ai didi

delphi - 在 Delphi 中将数据从 TByte 复制到字节数组的正确方法

转载 作者:行者123 更新时间:2023-12-03 14:52:07 26 4
gpt4 key购买 nike

鉴于以下情况:

LBytes: TBytes;
LArr: array[1..512] of Byte;
...
SetLength(LBytes, 512);

将所有字节从 LBytes 复制到 LArr 的正确 Move() 调用是什么?

Move(LBytes[0], LArr, Length(LBytes)); // works

Move(LBytes[0], LArr[1], Length(LBytes)); // works, too

Move(LBytes, LArr[1], Length(LBytes)); // fail

有人可以解释为什么使用 Larr 和 Larr[1] 之间没有区别,但 LBytes[0] 和 LBytes 之间有区别吗?

最佳答案

Can someone explain why it makes no difference between using Larr and Larr1 but makes a difference between LBytes[0] and LBytes?

这是因为 LBytes 是一个动态数组,它最终是一个指向该数组的指针。另一方面,LArr 是数组。

另一种说法是动态数组是引用类型,固定长度数组是值类型。

在我的书中,有两种可行的方法可以做到这一点:

Assert(Length(LBytes)<=Length(LArr));
Move(LBytes[0], LArr, Length(LBytes));

Assert(Length(LBytes)<=Length(LArr));
Move(Pointer(LBytes)^, LArr, Length(LBytes));

我更喜欢后者,因为当启用范围检查时,它可以适应零长度数组。在这种情况下,第一个代码块会导致运行时间范围检查错误。

您可能还会有动力避免这种低级的欺骗行为。我有一个utility class这让我可以写:

TArray.Move<Byte>(LBytes, LArr);

该方法的签名是:

class procedure Move<T>(const Source: array of T; var Dest: array of T); overload; static;

关于delphi - 在 Delphi 中将数据从 TByte 复制到字节数组的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com