通讯中的校验和的检测,方法要求是:
 校验和(8Byte)
      16进制字符(0-F)表示的32位整数(8B)。
      校验和的算法如下:
      对“消息头+会话头+事务头+操作信息”按32位异或,对异或结果取反后的值为校验和。
1。有谁能告诉我有关dephi中对16进制的运算
2。取反运算如何实现
3。字符可以参加运算?    

解决方案 »

  1.   

    异或xor
    取反not
    #11=17
    $#11表示'17'
      

  2.   

    铁甲兄:
    这里你还是没有说清楚啊 。
    “消息头+会话头+事务头+操作信息”
    这个里面可能所有的字符都有啊。
    而且not处理后出现负数如何处理?
    请你给个详细的例子可以吗?
    急待处理?
      

  3.   

    ShowMessage(chr($58));
    这样你应该明白我的意思了吧。'X'的ASCII码是58,你所有的字符都是数字了
    ord是chr的逆运算。
    not怎么会出负数。你肯定理解错了,校验和要的是一个16进制的字符串,按byte来算。
      

  4.   

    譬如:
    消息头为  ='AABBCCD25478=:'ABcdF'';
    会话头    ='FFCCBEG'SC'XXXPPYY';
    事务头    ='XXYYBBDD';
    操作信息  ='yyzzcc';
    用dephi处理如何计算校验和,得到校验和(8Byte)
      

  5.   

    以事务头为例:
    str := 'XXYYBBDD';
    for i :=1 to Length(Str) do
    begin
     tmpstr := tmpStr+ord(Str[i])
    end
    这就可以得到你要的16进制的字符串,其他的如果给200分也许有人帮你写代码。
      

  6.   

    以字节运算为例!
    var a array[1..25] of byte;
        i: Word;
        Num: Byte;
    ......
    begin
      ...
      Num := 0;
      for i := 1 to 25 do
        Num := Num + a[i];     //累加和
      Num := Num xor $FF;      //Num 的反码   可以理解为按位取反
      Num := Num + 1;          //取反后加1为Num的补码  这是你需要的
      ....
      //如果要Num的最高位取反则
      Num := Num xor $80;    依次类推
    end;楼主需理解“进制”与“数”的区别。无论一个数用多少进制表示 它的值是恒定的,“进制”仅仅是一个数的表现形式而异。故16进制运算就10进制运算。