gpt4 book ai didi

arrays - 有没有一种干净的方法可以在编译时声明 TBytes 兼容的值?

转载 作者:行者123 更新时间:2023-12-03 15:29:45 24 4
gpt4 key购买 nike

如果我想声明一个静态编译时字节数组,我可以这样做:

var
bytes :array[0..24] of Byte = (1, 2, 3, .... );

但是,它的类型是字节数组[0..24],而不是System.TArray<System.Byte> ,通常称为 TBytes .

我需要的是 TBytes 类型的东西,但我不想添加初始化部分来以某种痛苦的方式保存这些字节值:

var
bytes2:TBytes;
initialization
SetLength(bytes2,24);
bytes2[0] := 1; bytes2[1] := 2; ....

有什么方法可以做到这一点:

var
bytes2:TBytes = (1,2,3, .... );

我还尝试找到一种从 TByte 快速转换的方法( System.TArray<System.Byte>) 和 Byte 的数组[0..24],如下所示:

 bytes2 := byte;

不幸的是,我能得到的最接近的是这个暴力代码:

  SetLength(bytes2,Length(bytes));
for n := 0 to Length(bytes) do begin
bytes2[n] := bytes[n];
end;

在我看来,两种类型密切相关,编译器可以做得更好一点,允许我从一种类型强制或复制到另一种类型。还有人对各种类型的“Array of X”有同样的感觉吗?知道有什么很酷的方法吗?如果编译器做了一些魔法,它可能会使 Move(...) 函数适用于这种情况,但 Move 实际上会给您带来访问冲突,并且不能与动态数组或泛型集合一起使用。

最佳答案

怎么样:

var
bytes: TBytes;
begin
bytes := TBytes.Create(1,2,3, .... );
end;

也就是说,我总是发现这种语法不接受开放数组是有限制的。所以我有一堆如下所示的函数:

function Bytes(const A: array of Byte): TBytes;
var
i: Integer;
begin
SetLength(Result, Length(A));
for i := low(Result) to high(Result) do
Result[i] := A[i];
end;
...
var
b1, b2: TBytes;
b3: array of Byte;
b4: array [0..42] of Byte;
...
b1 := Bytes(b2);
b1 := Bytes(b3);
b1 := Bytes(b4);
b1 := Bytes([1,2,3,4]);

我相信 XE 中的各种泛型增强意味着这可以使用泛型来完成,而无需为每个不同的标量重复 Bytes 等例程。

关于arrays - 有没有一种干净的方法可以在编译时声明 TBytes 兼容的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5183569/

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