CRC16校验码计算

CRC16校验码计算
 1、预置116位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
 2、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
 3、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
 4、如果移出位为0:重复第3步(再次右移一位);如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
 5、重复步骤34,直到右移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就是数据校验后添加了校验码的数据
}