对于通讯协议的封装来说,经常就是“拼字节”,“拼字节的位”。
本篇通过汉字机内码的例子来说明DELPHI对字节是如何操作的。
一个汉字占用2个字节的内存空间,也就是一个字,一个字=二个字节。
“啊”字的汉字机内码则是B0A1H,那么DELPHI如何通过机内码来显示“啊”字呢?
DELPHI的16进制数表示类似$B0,C语言是0XB0。
B0A1H:就是一个字的16进制表示,$B0是第一个字节,$A1是第二个字节。末尾H表示是16进制。
方法一:字节操作
var
a: array [0 .. 1] of byte;
s: AnsiString;
begin
a[0] :=$B0;
a[1] := $A1;
SetLength(s, SizeOf(a) + 1);
Move(a, s[1], SizeOf(a));
ShowMessage(string(s)); // 啊
方法二:字操作
var
s: AnsiString;
w: Word;
begin
w := $A1B0; // B0A1H 此处注意要反过来,$A1B0中A1是高字节,B0是低字节
SetLength(s, 3);
Move(w, s[1], 2);
ShowMessage(string(s)); // 啊
根据汉字机码计算区位码: 区位码=汉字机内码-A0A0H
BEDFH-A0A0H=1E3FH
var
g, h, t: Word;
z: array[0..1] of Byte;
begin
g := $DFBE;
h := $A0A0;
t := g - h;
Move(t, z, 2); // z[0]=$1E, z[1]=$3F
ShowMessage(IntToHex(t, 2)); // 3F1E
根据汉字国标码计算机内码: 汉字机内码=汉字国标码+8080H
“啊”字的国标码是3021H
3021H + 8080H = B0A1H
var
g, h, t: Word;
a: array[0..1] of Byte;
begin
// 3021H + 8080H = B0A1H
g := $2130;
h := $8080;
t := g + h;
Move(t, a, 2); // a[0]=$B0, a[1]=$A1
ShowMessage(IntToHex(t,2)); // A1B0