CRC16校验码计算
1、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
2、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
3、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4、如果移出位为0:重复第3步(再次右移一位);如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
8、最后得到的CRC寄存器内容即为CRC16码。(注意得到的CRC码即为低前高后顺序)
请各位给出相应的算法
我需要的是具体的生成校验码的 代码我之前生成的 不一致
//
////////////////////////////
//函数名称:CaculateCRC
//函数功能:计算CRC校验码
//参数说明:
// u8 Data:待计算的数据的指针,此指针为无符号的单字节的指针
// u16 len: 待计算的数据长度,长度参数是无符号的16位(双字节)数据
//返回值: 返回计算得到的CRC校验码结果
/***********/
u16 CaculateCRC(u8 *Data, u16 len)
{
u16 n,i;
u16 crc=0xffff;
for(n=0;n<len;n++)
{
crc ^= Data[n];
for(i=0;i<8;i++)
{
if((crc&1)==1)
{
crc >>= 1;
crc ^= 0xa001;
}
else
crc >>= 1;
}
}
return(crc);
}
需要什么语言的,你可以看看我的文章,包含了很多crc
那就直接给个函数吧
public static byte[] crc16(byte[] bt){
int CRC = 0xFFFF;
int EXP = 0xA001;
byte[] checkData = new byte[bt.length+2];
int[] data = new int[bt.length];
int xda = CRC;
int xdabit = 0;
for(int i=0;i<bt.length;i++){
data[i] = bt[i] & 0xFF;
}
for(int i=0;i<data.length;i++){
xda ^= data[i];
for(int j=0;j<8;j++){
xdabit =(int)(xda & 0x01);
xda >>= 1;
if(xdabit==1){
xda ^= EXP;
}
}
checkData[i] = bt[i];
}
checkData[checkData.length-2] = (byte) (xda & 0xFF);
checkData[checkData.length-1] = (byte) (xda>>8);
byte[] crc = new byte[2];
crc[0] = (byte) (xda & 0xFF);
crc[1] = (byte) (xda>>8);
return crc; //这里返回checkData就是数据校验后添加了校验码的数据
}