Delphi CRC-CCITT(0xFFFF)功能?
有人能帮我用Delphi实现CRC-CCITT(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
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.