如果我想声明一个Byte的静态编译时数组,我可以这样做:
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, .... );
我还试图找到一种方法来快速转换TBytes(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;
在我看来,两种类型密切相关,编译器可以做得更好,允许我强制或复制,从一种类型到另一种类型。对于各种类型的“X阵列”,还有其他人有这种感觉吗?知道任何很酷的方法吗?如果编译器做了一些魔术,它可能使Move(...)函数适用于这种情况,但Move实际上会给你一个访问冲突,并且不能用于动态数组或泛型集合。
答案 0 :(得分:4)
怎么样:
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
之类的例程。