如何声明一个与TBytes兼容的值,使其在编译时既干净又高效?

2026-04-10 16:171阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计525个文字,预计阅读时间需要3分钟。

如何声明一个与TBytes兼容的值,使其在编译时既干净又高效?

如果您想声明一个表示一个Byte静态数组的变量,可以直接这样做:

C#var bytes=new byte[25] { 1, 2, 3, ..., 24 };

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

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

但是,它的类型是byte的字节[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;

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

如何声明一个与TBytes兼容的值,使其在编译时既干净又高效?

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

在我看来,两种类型密切相关,编译器可以做得更好,允许我强制或复制,从一种类型到另一种类型.对于各种类型的“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中的各种泛型增强功能意味着可以使用泛型来完成,并且不会为每个不同的标量重复像字节这样的例程.

本文共计525个文字,预计阅读时间需要3分钟。

如何声明一个与TBytes兼容的值,使其在编译时既干净又高效?

如果您想声明一个表示一个Byte静态数组的变量,可以直接这样做:

C#var bytes=new byte[25] { 1, 2, 3, ..., 24 };

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

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

但是,它的类型是byte的字节[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;

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

如何声明一个与TBytes兼容的值,使其在编译时既干净又高效?

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

在我看来,两种类型密切相关,编译器可以做得更好,允许我强制或复制,从一种类型到另一种类型.对于各种类型的“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中的各种泛型增强功能意味着可以使用泛型来完成,并且不会为每个不同的标量重复像字节这样的例程.