问题:对一段内容进行传送,在最后一个字节为前边内容的模2和,请问最后一个字节的内容是如何得到的,也就是模2和的算法.

解决方案 »

  1.   

    对于keity()
      你所说的就是xor运算,
    例如有以下数据:EB,90,84  最后的校验码为01  ,均为十六进制,
    又如:EB,90,83,06,05,ff,38 最后的校验码为c0
    请大家看看算法
      

  2.   

    可能是将字节相加的结果再取反+1
    (以下都是对字节计算)
    1.EB+90+84 = ff  取反 +1 = 01
    2.EB+90+83+06+05+ff+38=40 取反+1 = c0
      

  3.   

    对于Keiy()
    可能是将字节相加的结果再取反+1
    (以下都是对字节计算)
    1.EB+90+84 = ff  取反 +1 = 01
    2.EB+90+83+06+05+ff+38=40 取反+1 = c0你说的+是不是xor(异和),还是什么
    如是xor,如下写,
    var
      b:array of byte;
      br:byte;
      i:integer;
      r:integer;
    begin
      setlength(b,7);
      b[0]:=$eb;
      b[1]:=$90;
      b[2]:=$83;
      b[3]:=$06;
      b[4]:=$05;
      b[5]:=$ff;
      b[6]:=$38;
      br:=b[0];
        for i:=low(b)+1 to high(b) do
        br:=br xor b[i];
       //br最后得到为3c ,不是40
     // br:=Lo(i);
      //br:=$40;
      br:=not br;
      br:=br+1;
      edit1.text:=format('%X',[br]);  
      

  4.   

    liu9527(小刀)说的是正确的,“模二和”就是对数据进行异或运算,这是一种最简单的数据校验方式,很常见的。
      

  5.   

    ifPyh:但是我不能得到正确的结果,也就是说根据我上面写的得到校验码不符合结果如:EB,90,83,06,05,ff,38  我计算的值是(3c 而后3c取反+1, )和 最后的校验码(c0)不相同,怎么回事?
    也就是不知道
    keiy() ( ) 的
    2.EB+90+83+06+05+ff+38=40 取反+1 = c0   是怎么得来的
      

  6.   

    我是用按位+(而非xor)而得的结果(以字节计算)
      

  7.   

    程序如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      b:array of byte;
      br:byte;
      i:integer;
      r:integer;
    begin
      setlength(b,7);
      b[0]:=$eb;
      b[1]:=$90;
      b[2]:=$83;
      b[3]:=$06;
      b[4]:=$05;
      b[5]:=$ff;
      b[6]:=$38;
      br:=b[0];
      for i:=1 to 6 do
        br:=br+b[i];
      br:=not br;
      br:=br+1;
      Edit1.Text:=inttohex(br,2);
    end;
    结果为c0
      

  8.   

    谢谢 keiy() 
    马上结贴