关于CRC16算法的问题
做一个项目,其中有个一个CRC16算法,下面是之前的同事用C实现的(可能是在网上copy的)
#define CRC_SEED 0xFFFF
#define POLY16 0x1021
unsigned short crc_generateCRC16(unsigned char *buf, int length)
{
unsigned short crc,data,val;
int i;
crc = CRC_SEED;
for(i=0;i<length;i++) {
if((i % 8) == 0)
data = (*buf++)<<8;
val = crc ^ data;
crc = crc << 1;
data = data <<1;
if(val & 0x8000)
crc = crc ^ POLY16;
}
return crc;
}
现在用Delphi 改写如下
function crc_generateCRC16(buff:PByte;length:integer):word;
const CRC_SEED = $FFFF;
const POLY16 = $1021;
var
crc,data,val:word;
i:integer;
begin
crc := $FFFF; data:=0;
for i:=0 to length do
begin
if ((i mod 8) =0) then
begin
data:= (buff^) shl 8;
integer(buff):=integer(buff)+1;
end;
val:=crc xor data;
crc:= crc shl 1;
data:=data shl 1;
if ((val and $8000)<>0) then crc := crc xor $1021;
end;
result:=crc;
end;
问题是 ,改写后算出的结果和之前C的不一致,比如 之前C写的 计算 5C 07 的CRC16 结果是 0xdfbe,而改写后的却怎么算都不是这个。请各位大侠帮帮我,问题出在哪了!
#define CRC_SEED 0xFFFF
#define POLY16 0x1021
unsigned short crc_generateCRC16(unsigned char *buf, int length)
{
unsigned short crc,data,val;
int i;
crc = CRC_SEED;
for(i=0;i<length;i++) {
if((i % 8) == 0)
data = (*buf++)<<8;
val = crc ^ data;
crc = crc << 1;
data = data <<1;
if(val & 0x8000)
crc = crc ^ POLY16;
}
return crc;
}
现在用Delphi 改写如下
function crc_generateCRC16(buff:PByte;length:integer):word;
const CRC_SEED = $FFFF;
const POLY16 = $1021;
var
crc,data,val:word;
i:integer;
begin
crc := $FFFF; data:=0;
for i:=0 to length do
begin
if ((i mod 8) =0) then
begin
data:= (buff^) shl 8;
integer(buff):=integer(buff)+1;
end;
val:=crc xor data;
crc:= crc shl 1;
data:=data shl 1;
if ((val and $8000)<>0) then crc := crc xor $1021;
end;
result:=crc;
end;
问题是 ,改写后算出的结果和之前C的不一致,比如 之前C写的 计算 5C 07 的CRC16 结果是 0xdfbe,而改写后的却怎么算都不是这个。请各位大侠帮帮我,问题出在哪了!
...全文
相关推荐
mycrc16-CRC16算法可设置寄存器初值
标准CRC16算法,可设置初值,可选modbus算法
Crc-16检验算法
crc -16 校验算法 此程序主要有查表 和一般算法 的 是基于vb.net开发
C#写的CRC16校验算法
C#写的CRC16校验算法,分为CRC16和ModbusCRC16两种,使用方法请参考Demo
CRC16校验算法C#源代码
CRC16校验算法C#源代码。先初始化,然后一个个放入需要校验的数,不过只支持10进制
CRC16_check.rar_ crc16_CRC16_CRC校验算法_crc16_check_单片机crc16
单片机用的CRC校验算法程序。CRC16


