Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi CRC-CCITT(0xFFFF)功能?_Delphi_Crc - Fatal编程技术网

Delphi CRC-CCITT(0xFFFF)功能?

Delphi CRC-CCITT(0xFFFF)功能?,delphi,crc,Delphi,Crc,有人能帮我用Delphi实现CRC-CCITT(0xFFFF)吗 已经获得了Java版本,但在如何将其移植到Delphi方面存在困惑 public static int CRC16CCITT(字节[]字节){ int crc=0xFFFF;//初始值 int多项式=0x1021;//0001 0000 0010 0001(0,5,12) for(字节b:字节){ 对于(int i=0;i>(7-i)&1)==1); 布尔值c15=((crc>>15&1)==1); crc 0xFFFF转换为$F

有人能帮我用Delphi实现CRC-CCITT(
0xFFFF
)吗

已经获得了Java版本,但在如何将其移植到Delphi方面存在困惑

public static int CRC16CCITT(字节[]字节){
int crc=0xFFFF;//初始值
int多项式=0x1021;//0001 0000 0010 0001(0,5,12)
for(字节b:字节){
对于(int i=0;i<8;i++){
布尔位=((b>>(7-i)&1)==1);
布尔值c15=((crc>>15&1)==1);
crc
  • 0xFFFF
    转换为
    $FFFF
  • 转换为
  • ^
    转换为
    xor
  • 转换为
    shr

  • x^=y
    转换为
    x:=xor y
    ,类似于
    &=
    您可以在Delphi加密概要(DEC)组件中找到一个

    5校验和(CRC32、CRC16-CCITT、CRC16标准…)

    函数CRC16CCITT(字节:TBytes):字;
    常数
    多项式=$1021;//0001 0000 0010 0001(0,5,12)
    变量
    crc:字;
    一、 J:整数;
    b:字节;
    位,c15:布尔值;
    开始
    crc:=$FFFF;//初始值
    对于I:=0到高(字节)do
    开始
    b:=字节[I];
    对于J:=0到7 do
    开始
    位:=((b shr(7-J))和1)=1;
    c15:=((crc shr 15)和1)=1);
    crc:=crc shl 1;
    如果((c15异或位)0),则crc:=crc异或多项式;
    结束;
    结束;
    结果:=crc和$ffff;
    结束;
    
    我发现了一些有效的代码:

    function crc16(Buffer:String;Polynom,Initial:Cardinal):Cardinal;
    var
      i,j: Integer;
    begin
    Result:=Initial;
    for i:=1 to Length(Buffer) do begin
      Result:=Result xor (ord(buffer[i]) shl 8);
      for j:=0 to 7 do begin
        if (Result and $8000)<>0 then Result:=(Result shl 1) xor Polynom
        else Result:=Result shl 1;
        end;
      end;
    Result:=Result and $ffff;
    end;
    
    函数crc16(缓冲区:字符串;多项式,首字母:基数):基数;
    变量
    i、 j:整数;
    开始
    结果:=初始值;
    对于i:=1到长度(缓冲区)do begin
    结果:=结果xor(ord(缓冲区[i])shl 8);
    对于j:=0到7,开始
    如果(结果和$8000)0,则结果:=(结果shl 1)异或多项式
    其他结果:=结果shl 1;
    结束;
    结束;
    结果:=结果和$ffff;
    结束;
    

    源代码:

    您的代码不起作用,但谢谢(操作数):位:=((b shr(7-I))和1)=1;c15:=((crc shr 15)和1)=1;@peimanF这是一个问题还是一个语句?实际问题是什么?这段代码是OP的Java代码的直接翻译。结果应该是一样的。代码在Delphi XE7上确实失败
    function CRC16CCITT(bytes: TBytes): Word;
    const
      polynomial = $1021;   // 0001 0000 0010 0001  (0, 5, 12)
    var
      crc: Word;
      I, J: Integer;
      b: Byte;
      bit, c15: Boolean;
    begin
      crc := $FFFF; // initial value
      for I := 0 to High(bytes) do
      begin
        b := bytes[I];
        for J := 0 to 7 do
        begin
          bit := (((b shr (7-J)) and 1) = 1);
          c15 := (((crc shr 15) and 1) = 1);
          crc := crc shl 1;
          if ((c15 xor bit) <> 0) then crc := crc xor polynomial;
        end;
      end;
      Result := crc and $ffff;
    end;
    
    function crc16(Buffer:String;Polynom,Initial:Cardinal):Cardinal;
    var
      i,j: Integer;
    begin
    Result:=Initial;
    for i:=1 to Length(Buffer) do begin
      Result:=Result xor (ord(buffer[i]) shl 8);
      for j:=0 to 7 do begin
        if (Result and $8000)<>0 then Result:=(Result shl 1) xor Polynom
        else Result:=Result shl 1;
        end;
      end;
    Result:=Result and $ffff;
    end;
    
    unit CRC16CCITT;
    
    interface
    
      function ComputeCRC16CCITT(crc: word; const data: PByte; len:integer) : word;
    
    implementation
    
    const
      crc16_table: array [0..$FF] of word = (0,4489,8978,12955,17956,22445,25910,29887,35912,40385,44890,48851,51820,56293,59774,
        63735,4225,264,13203,8730,22181,18220,30135,25662,40137,36160,49115,44626,56045,52068,63999,
        59510,8450,12427,528,5017,26406,30383,17460,21949,44362,48323,36440,40913,60270,64231,51324,
        55797,12675,8202,4753,792,30631,26158,21685,17724,48587,44098,40665,36688,64495,60006,55549,
        51572,16900,21389,24854,28831,1056,5545,10034,14011,52812,57285,60766,64727,34920,39393,43898,
        47859,21125,17164,29079,24606,5281,1320,14259,9786,57037,53060,64991,60502,39145,35168,48123,
        43634,25350,29327,16404,20893,9506,13483,1584,6073,61262,65223,52316,56789,43370,47331,35448,
        39921,29575,25102,20629,16668,13731,9258,5809,1848,65487,60998,56541,52564,47595,43106,39673,
        35696,33800,38273,42778,46739,49708,54181,57662,61623,2112,6601,11090,15067,20068,24557,28022,
        31999,38025,34048,47003,42514,53933,49956,61887,57398,6337,2376,15315,10842,24293,20332,32247,
        27774,42250,46211,34328,38801,58158,62119,49212,53685,10562,14539,2640,7129,28518,32495,19572,
        24061,46475,41986,38553,34576,62383,57894,53437,49460,14787,10314,6865,2904,32743,28270,23797,
        19836,50700,55173,58654,62615,32808,37281,41786,45747,19012,23501,26966,30943,3168,7657,12146,
        16123,54925,50948,62879,58390,37033,33056,46011,41522,23237,19276,31191,26718,7393,3432,16371,
        11898,59150,63111,50204,54677,41258,45219,33336,37809,27462,31439,18516,23005,11618,15595,3696,
        8185,63375,58886,54429,50452,45483,40994,37561,33584,31687,27214,22741,18780,15843,11370,7921,
        3960);
    
      function ComputeCRC16CCITT(crc: word; const data: PByte; len:integer) : word;
      var
        i : integer;
      begin
        for i := 0 to len-1 do  
          crc := (crc shr 8) xor crc16_table[(crc xor data[i]) and $ff];
        result := crc;
      end;
    
    end.