CRC16 循环冗余校验
贴出几个语言版本的CRC校验程序,整体都差不多,但是因为语言上面的差异,还是有些微调。
C语言版本
/*
* 函数名 :CRC16
* 描述 : 计算CRC16
* 输入 : ptr---数据,len---长度
* 输出 : 校验值
*/
uint16_t CRC16(uint8_t *ptr,uint16_t len)
{
unsigned char i;
unsigned short crc = 0xFFFF;
if(len==0)
{
len = 1;
}
while(len--)
{
crc ^= *ptr;
for(i=0; i<8; i++)
{
if(crc&1)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
ptr++;
}
return(crc);
}
Java版本
/*
* 函数名:CRC16
* 描述 : 计算CRC16
* 输入 :aData---数据, aSize---数据长度
* 输出 : 校验值
*/
public int CRC16(byte[] ptr, int len)
{
byte i;
int n = 0;
int crc = 0xFFFF;
if(len==0)
{
len = 1;
}
while ((len--) > 0)
{
crc ^=( ptr[n] &0x0ff);
for(i=0; i<8; i++)
{
if((crc&1)!=0)
{
crc >>= 1;
crc ^= (0xA001&0x0ffff);
}
else
{
crc >>= 1;
}
}
n++;
}
return (crc&0xffff);
}
C#版本
/*
* 函数名:CRC16
* 描述 : 计算CRC16
* 输入 :aData---数据, aSize---数据长度
* 输出 : 校验值
*/
public ushort CRC16(byte[] ptr, int len)
{
byte i;
int n = 0;
ushort crc = 0xFFFF;
if(len==0)
{
len = 1;
}
while ((len--) > 0)
{
crc ^= ptr[n];
for(i=0; i<8; i++)
{
if((crc&1)!=0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
n++;
}
return (crc);
}