function CalCRC16(AData: array of Byte; AStart, AEnd: Integer): string;
const
GENP=$8408; //多項式公式X16+X15+X2+1(1100 0000 0000 0101) //$A001
var
crc:Word;
i:Integer;
tmp:Byte;
s:string;
procedure CalOneByte(AByte:Byte); //計算1個字節的校驗碼
var
j:Integer;
begin
crc:=crc xor AByte; //將數據與CRC寄存器的低8位進行異或
for j:=0 to 7 do //對每一位進行校驗
begin
tmp:=crc and 1; //取出最低位
crc:=crc shr 1; //寄存器向右移一位
crc:=crc and $7FFF; //將最高位置0
if tmp=1 then //檢測移出的位,如果為1,那么與多項式異或
crc:=crc xor GENP;
crc:=crc and $FFFF;
end;
end;
begin
crc:=$FFFF; //將余數設定為FFFF
for i:=AStart to AEnd do //對每一個字節進行校驗
CalOneByte(AData[i]);
s:=inttohex(crc,2);
Result:= rightstr(s,2)+leftstr(s,2);
end;
轉換函數
function TForm1.strtocrc(s: string): string;
var
buf1:array[0..256] of byte;
i:integer;
strOrder:string;
Res: string;
begin
strOrder :=StringReplace(s,' ','',[rfReplaceAll]);
for i:=0 to (length(strOrder) div 2-1) do
buf1[i]:= HexToInt1(copy(strOrder, i*2 + 1,2));
result:=s+CalCRC16(buf1,Low(buf1),length(strOrder) div 2-1);
end;