Byte,TBytes,array of Byte, array[0..9] of byte的区别

时间:2023-03-09 02:57:34
Byte,TBytes,array of Byte, array[0..9] of byte的区别

Byte前面已经说是存放bit的单元,是电脑内存的基本单位,byte表示0-255中的256个数字

下面为Byte的用法:

var
B: Byte; // 表示0-255的数字
begin
B := 1;
Log(B.ToString()); //1 B := 255;
Log(B.ToString()); //255
end;

下面将Char转换成Byte:

var
C: Char; // char 表示字符任意字符
begin
C := '1';
Log(C); // 1
Log(SizeOf(C).ToString()); //2 一个Char占两个Byte
Log(Byte(C).ToString()); // 49 Byte强制转换 将Chr转换成Byte 这里1的字符用Ascii表示49
// 那怎么原样输出呢
Log(StringOf(BytesOf(C))); //1 这样将chr转换成Byte,然后再讲Byte转换成string才是原样 C := '我';
Log(C); // 我
Log(SizeOf(C).ToString()); //2
Log(Byte(C).ToString()); // 17,为嘛是17呢? 看下面 一个字节无法存放一个中文字符
Log(StringOf(BytesOf(C))); // 我,这里C占两个字节,为TBytes,所以不能直接用Byte强制转换,Byte强制转换只能转一个字节
end;

TBytes跟array of byte 一样,即为动态数组,使用时需要SetLength(a, n),

下面为TBytes和array[0..9] of byte的区别:

var
a: TBytes; // array of Byte
b: array[0..9] of byte;
s: string;
i: integer;
begin
s := '12345';
SetLength(a, s.Length); // 动态数组
for I := 0 to s.Length-1 do
begin
a[i] := Byte(s[i+1]);
Log(a[i].ToString()); //49 50 51 52 53
end; for I := 0 to s.Length-1 do // 静态数组
begin
b[i] := Byte(s[i+1]);
Log(b[i].ToString()); //49 50 51 52 53
end;
end;

虽然说效果上是一样的,但这里提醒一下,要用到串口通讯的时候,这两种数组在底层实现方法和寻址都是有区别的,但长度还是一样,

不影响平常的使用,在串口通讯中,是用到静态数组,用动态数组时,inbuff的内容会改变,所以输出时需要将动态数组转换成动态数组输出。

串口通讯实例,下次有时间补上。