通讯中的校验和的检测,方法要求是:
 校验和(8Byte)
      16进制字符(0-F)表示的32位整数(8B)。
      校验和的算法如下:
      对“消息头+会话头+事务头+操作信息”按32位异或,对异或结果取反后的值为校验和。
1。有谁能告诉我有关dephi中对16进制的运算
2。取反运算如何实现
3。字符可以参加运算?    譬如:
消息头为  ='AABBCCD25478=:'ABcdF'';
会话头    ='FFCCBEG'SC'XXXPPYY';
事务头    ='XXYYBBDD';
操作信息  ='yyzzcc';
用dephi处理如何计算校验和,得到校验和(8Byte)请高手回答本人很着急!分数给100!

解决方案 »

  1.   

    你一会说“校验和(8Byte)”,就是要8个字节,
    一会又说“16进制字符(0-F)表示的32位整数(8B)”,32位整数可只有4个字节哦
      

  2.   

    应该是32位异或得到的是8byte的结果
      

  3.   

    xor-异或
    not-取反
    异或和偶这边用这个方法算异或和,checksum:=a xor b xor c ...变量都是byte类型的,byte是8bit长度
      

  4.   

    32位异或得到的仍然是32位的结果(4Byte)
    你最好把对方的要求问清楚
      

  5.   

    写了一个字符串的校验示例,你先凑合着看看吧:
    procedure GetCheckCode(Data: string; out CheckCode: array of byte);
    var
      P, L, C: Integer;
    begin
      Setlength(CheckCode, 4);   // 32位校验码(4字节),如果需要8字节,将这句的4改为8。
      P := 1;
      L := Length(Data);
      if L mod 4 > 0 then        // 考虑补齐的情况
      begin
        Data := Data + DupeString(#0, 4 - L mod 4);
        Inc(L, 4 - L mod 4);
      end;
      C := 0;
      while P < L do
      begin
        C := C xor Integer(@Data[P]);
        Inc(P, 4);
      end;
      C := not C;
      CopyMemory(@CheckCode[0], @C, 4); 
    end;function GetCheckCodeInt(Data: string): Integer;
    var
      CheckCode: array of byte;
    begin
      GetCheckCode(Data, CheckCode);
      Result := Integer(@CheckCode[0]);
    end;说明:
    GetCheckCode() 是把校验码输出到字节数组,GetCheckCodeInt() 是把校验码输出为32位整型数。