需要使用前面的#符号将十六进制值转换为ascii dec

时间:2015-05-05 18:12:55

标签: hex ascii delphi-xe7

check1, check2: AnsiString;
begin
    //How come this works?
    check1 := #130;//  Checksum

    // But not this
    check2 := '#' + IntToStr($82);
end;

如果我知道它的校验和,它将使用#130分配校验变量。 但是当我将校验和计算为130时,我必须连接#和130,它不起作用。

1 个答案:

答案 0 :(得分:1)

很难说你想要做什么,但是你正在使用的两个任务正在做很多不同的事情。

check1 := #130;将带有字节值130的ANSI字符放入字符串,#字符串文字外''告诉编译器您正在定义具有特定字节值的字符 - 取决于编码结果字符串值将为'é'

check2 := '#' + IntToStr($82);只会将'#'字符与字符串值$82整数常量 - '130'连接起来,因此生成的字符串值将为'#130'

如果您尝试将具有某些计算值的字符放入字符串中,那么您应该使用chr函数

check2 := chr($82);

还有{$HIGHCHARUNICODE}编译器指令定义了Delphi 2009和更新版本中编译器如何解释字符文字

  

HIGHCHARUNICODEOFF时:

     

所有十进制#xxx n位数文字都被解析为AnsiChar。所有   十六进制#$ xx 2位数文字被解析为AnsiChar。所有   十六进制#$ xxxx 4位数文字被解析为WideChar。

     

HIGHCHARUNICODEON时:所有文字都被解析为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;