check1, check2: AnsiString;
begin
//How come this works?
check1 := #130;// Checksum
// But not this
check2 := '#' + IntToStr($82);
end;
如果我知道它的校验和,它将使用#130分配校验变量。 但是当我将校验和计算为130时,我必须连接#和130,它不起作用。
答案 0 :(得分:1)
很难说你想要做什么,但是你正在使用的两个任务正在做很多不同的事情。
check1 := #130;
将带有字节值130
的ANSI字符放入字符串,#
字符串文字外''
告诉编译器您正在定义具有特定字节值的字符 - 取决于编码结果字符串值将为'é'
check2 := '#' + IntToStr($82);
只会将'#'
字符与字符串值$82
整数常量 - '130'
连接起来,因此生成的字符串值将为'#130'
如果您尝试将具有某些计算值的字符放入字符串中,那么您应该使用chr
函数
check2 := chr($82);
还有{$HIGHCHARUNICODE}编译器指令定义了Delphi 2009和更新版本中编译器如何解释字符文字
当
HIGHCHARUNICODE
为OFF
时:所有十进制#xxx n位数文字都被解析为AnsiChar。所有 十六进制#$ xx 2位数文字被解析为AnsiChar。所有 十六进制#$ xxxx 4位数文字被解析为WideChar。
当
HIGHCHARUNICODE
为ON
时:所有文字都被解析为WideChar。
var
A: AnsiChar;
W: WideChar;
begin
{$HIGHCHARUNICODE OFF}
A := #$80; // Ord(A) = $80
W := #$80; // Ord(W) depends on default ANSI codepage; for example
// = $0402 for Win1251 codepage ('Ђ')
// = $20AC for Win1252 codepage ('€');
{$HIGHCHARUNICODE ON}
A := #$80; // Ord(A) = $3F ('?')
W := #$80; // Ord(W) = $80
A := #200; // Ord(A) depends on default ANSI codepage; for example
// = $45 for Win1251 codepage ('E')
// = $C8 for Win1252 codepage ('È');
W := #200; // Ord(W) = 200 ($C8)
end;