CRC-CCITT标准生成CRC校验码
//***************************************************************
//这里以CRC-CCITT标准生成多项式。CRC-CCITT是一个17位生成多项式
//G=[1 0001 0000 0010 0001],用多项式形式表示为G(x)=x16+x12
//+x5+1,由它产生的检验码R的二进制位数是16位(2字节)。
JAVA版:
package crc16_half;
import javax.xml.bind.DatatypeConverter;
import java.io.IOException;
public class half_crc {
static byte[] ha00 = {
(byte)0x00,(byte)0x10,(byte)0x20,(byte)0x30,(byte)0x40,(byte)0x50,(byte)0x60,(byte)0x70,(byte)0x81,(byte)0x91,(byte)0xA1,(byte)0xB1,(byte)0xC1,(byte)0xD1,(byte)0xE1,(byte)0xF1,
(byte)0x12,(byte)0x02,(byte)0x32,(byte)0x22,(byte)0x52,(byte)0x42,(byte)0x72,(byte)0x62,(byte)0x93,(byte)0x83,(byte)0xB3,(byte)0xA3,(byte)0xD3,(byte)0xC3,(byte)0xF3,(byte)0xE3,
(byte)0x24,(byte)0x34,(byte)0x04,(byte)0x14,(byte)0x64,(byte)0x74,(byte)0x44,(byte)0x54,(byte)0xA5,(byte)0xB5,(byte)0x85,(byte)0x95,(byte)0xE5,(byte)0xF5,(byte)0xC5,(byte)0xD5,
(byte)0x36,(byte)0x26,(byte)0x16,(byte)0x06,(byte)0x76,(byte)0x66,(byte)0x56,(byte)0x46,(byte)0xB7,(byte)0xA7,(byte)0x97,(byte)0x87,(byte)0xF7,(byte)0xE7,(byte)0xD7,(byte)0xC7,
(byte)0x48,(byte)0x58,(byte)0x68,(byte)0x78,(byte)0x08,(byte)0x18,(byte)0x28,(byte)0x38,(byte)0xC9,(byte)0xD9,(byte)0xE9,(byte)0xF9,(byte)0x89,(byte)0x99,(byte)0xA9,(byte)0xB9,
(byte)0x5A,(byte)0x4A,(byte)0x7A,(byte)0x6A,(byte)0x1A,(byte)0x0A,(byte)0x3A,(byte)0x2A,(byte)0xDB,(byte)0xCB,(byte)0xFB,(byte)0xEB,(byte)0x9B,(byte)0x8B,(byte)0xBB,(byte)0xAB,
(byte)0x6C,(byte)0x7C,(byte)0x4C,(byte)0x5C,(byte)0x2C,(byte)0x3C,(byte)0x0C,(byte)0x1C,(byte)0xED,(byte)0xFD,(byte)0xCD,(byte)0xDD,(byte)0xAD,(byte)0xBD,(byte)0x8D,(byte)0x9D,
(byte)0x7E,(byte)0x6E,(byte)0x5E,(byte)0x4E,(byte)0x3E,(byte)0x2E,(byte)0x1E,(byte)0x0E,(byte)0xFF,(byte)0xEF,(byte)0xDF,(byte)0xCF,(byte)0xBF,(byte)0xAF,(byte)0x9F,(byte)0x8F,
(byte)0x91,(byte)0x81,(byte)0xB1,(byte)0xA1,(byte)0xD1,(byte)0xC1,(byte)0xF1,(byte)0xE1,(byte)0x10,(byte)0x00,(byte)0x30,(byte)0x20,(byte)0x50,(byte)0x40,(byte)0x70,(byte)0x60,
(byte)0x83,(byte)0x93,(byte)0xA3,(byte)0xB3,(byte)0xC3,(byte)0xD3,(byte)0xE3,(byte)0xF3,(byte)0x02,(byte)0x12,(byte)0x22,(byte)0x32,(byte)0x42,(byte)0x52,(byte)0x62,(byte)0x72,
(byte)0xB5,(byte)0xA5,(byte)0x95,(byte)0x85,(byte)0xF5,(byte)0xE5,(byte)0xD5,(byte)0xC5,(byte)0x34,(byte)0x24,(byte)0x14,(byte)0x04,(byte)0x74,(byte)0x64,(byte)0x54,(byte)0x44,
(byte)0xA7,(byte)0xB7,(byte)0x87,(byte)0x97,(byte)0xE7,(byte)0xF7,(byte)0xC7,(byte)0xD7,(byte)0x26,(byte)0x36,(byte)0x06,(byte)0x16,(byte)0x66,(byte)0x76,(byte)0x46,(byte)0x56,
(byte)0xD9,(byte)0xC9,(byte)0xF9,(byte)0xE9,(byte)0x99,(byte)0x89,(byte)0xB9,(byte)0xA9,(byte)0x58,(byte)0x48,(byte)0x78,(byte)0x68,(byte)0x18,(byte)0x08,(byte)0x38,(byte)0x28,
(byte)0xCB,(byte)0xDB,(byte)0xEB,(byte)0xFB,(byte)0x8B,(byte)0x9B,(byte)0xAB,(byte)0xBB,(byte)0x4A,(byte)0x5A,(byte)0x6A,(byte)0x7A,(byte)0x0A,(byte)0x1A,(byte)0x2A,(byte)0x3A,
(byte)0xFD,(byte)0xED,(byte)0xDD,(byte)0xCD,(byte)0xBD,(byte)0xAD,(byte)0x9D,(byte)0x8D,(byte)0x7C,(byte)0x6C,(byte)0x5C,(byte)0x4C,(byte)0x3C,(byte)0x2C,(byte)0x1C,(byte)0x0C,
(byte)0xEF,(byte)0xFF,(byte)0xCF,(byte)0xDF,(byte)0xAF,(byte)0xBF,(byte)0x8F,(byte)0x9F,(byte)0x6E,(byte)0x7E,(byte)0x4E,(byte)0x5E,(byte)0x2E,(byte)0x3E,(byte)0x0E,(byte)0x1E};
import javax.xml.bind.DatatypeConverter;
import java.io.IOException;
public class half_crc {
static byte[] ha00 = {
(byte)0x00,(byte)0x10,(byte)0x20,(byte)0x30,(byte)0x40,(byte)0x50,(byte)0x60,(byte)0x70,(byte)0x81,(byte)0x91,(byte)0xA1,(byte)0xB1,(byte)0xC1,(byte)0xD1,(byte)0xE1,(byte)0xF1,
(byte)0x12,(byte)0x02,(byte)0x32,(byte)0x22,(byte)0x52,(byte)0x42,(byte)0x72,(byte)0x62,(byte)0x93,(byte)0x83,(byte)0xB3,(byte)0xA3,(byte)0xD3,(byte)0xC3,(byte)0xF3,(byte)0xE3,
(byte)0x24,(byte)0x34,(byte)0x04,(byte)0x14,(byte)0x64,(byte)0x74,(byte)0x44,(byte)0x54,(byte)0xA5,(byte)0xB5,(byte)0x85,(byte)0x95,(byte)0xE5,(byte)0xF5,(byte)0xC5,(byte)0xD5,
(byte)0x36,(byte)0x26,(byte)0x16,(byte)0x06,(byte)0x76,(byte)0x66,(byte)0x56,(byte)0x46,(byte)0xB7,(byte)0xA7,(byte)0x97,(byte)0x87,(byte)0xF7,(byte)0xE7,(byte)0xD7,(byte)0xC7,
(byte)0x48,(byte)0x58,(byte)0x68,(byte)0x78,(byte)0x08,(byte)0x18,(byte)0x28,(byte)0x38,(byte)0xC9,(byte)0xD9,(byte)0xE9,(byte)0xF9,(byte)0x89,(byte)0x99,(byte)0xA9,(byte)0xB9,
(byte)0x5A,(byte)0x4A,(byte)0x7A,(byte)0x6A,(byte)0x1A,(byte)0x0A,(byte)0x3A,(byte)0x2A,(byte)0xDB,(byte)0xCB,(byte)0xFB,(byte)0xEB,(byte)0x9B,(byte)0x8B,(byte)0xBB,(byte)0xAB,
(byte)0x6C,(byte)0x7C,(byte)0x4C,(byte)0x5C,(byte)0x2C,(byte)0x3C,(byte)0x0C,(byte)0x1C,(byte)0xED,(byte)0xFD,(byte)0xCD,(byte)0xDD,(byte)0xAD,(byte)0xBD,(byte)0x8D,(byte)0x9D,
(byte)0x7E,(byte)0x6E,(byte)0x5E,(byte)0x4E,(byte)0x3E,(byte)0x2E,(byte)0x1E,(byte)0x0E,(byte)0xFF,(byte)0xEF,(byte)0xDF,(byte)0xCF,(byte)0xBF,(byte)0xAF,(byte)0x9F,(byte)0x8F,
(byte)0x91,(byte)0x81,(byte)0xB1,(byte)0xA1,(byte)0xD1,(byte)0xC1,(byte)0xF1,(byte)0xE1,(byte)0x10,(byte)0x00,(byte)0x30,(byte)0x20,(byte)0x50,(byte)0x40,(byte)0x70,(byte)0x60,
(byte)0x83,(byte)0x93,(byte)0xA3,(byte)0xB3,(byte)0xC3,(byte)0xD3,(byte)0xE3,(byte)0xF3,(byte)0x02,(byte)0x12,(byte)0x22,(byte)0x32,(byte)0x42,(byte)0x52,(byte)0x62,(byte)0x72,
(byte)0xB5,(byte)0xA5,(byte)0x95,(byte)0x85,(byte)0xF5,(byte)0xE5,(byte)0xD5,(byte)0xC5,(byte)0x34,(byte)0x24,(byte)0x14,(byte)0x04,(byte)0x74,(byte)0x64,(byte)0x54,(byte)0x44,
(byte)0xA7,(byte)0xB7,(byte)0x87,(byte)0x97,(byte)0xE7,(byte)0xF7,(byte)0xC7,(byte)0xD7,(byte)0x26,(byte)0x36,(byte)0x06,(byte)0x16,(byte)0x66,(byte)0x76,(byte)0x46,(byte)0x56,
(byte)0xD9,(byte)0xC9,(byte)0xF9,(byte)0xE9,(byte)0x99,(byte)0x89,(byte)0xB9,(byte)0xA9,(byte)0x58,(byte)0x48,(byte)0x78,(byte)0x68,(byte)0x18,(byte)0x08,(byte)0x38,(byte)0x28,
(byte)0xCB,(byte)0xDB,(byte)0xEB,(byte)0xFB,(byte)0x8B,(byte)0x9B,(byte)0xAB,(byte)0xBB,(byte)0x4A,(byte)0x5A,(byte)0x6A,(byte)0x7A,(byte)0x0A,(byte)0x1A,(byte)0x2A,(byte)0x3A,
(byte)0xFD,(byte)0xED,(byte)0xDD,(byte)0xCD,(byte)0xBD,(byte)0xAD,(byte)0x9D,(byte)0x8D,(byte)0x7C,(byte)0x6C,(byte)0x5C,(byte)0x4C,(byte)0x3C,(byte)0x2C,(byte)0x1C,(byte)0x0C,
(byte)0xEF,(byte)0xFF,(byte)0xCF,(byte)0xDF,(byte)0xAF,(byte)0xBF,(byte)0x8F,(byte)0x9F,(byte)0x6E,(byte)0x7E,(byte)0x4E,(byte)0x5E,(byte)0x2E,(byte)0x3E,(byte)0x0E,(byte)0x1E};
static byte[] la00 = {
(byte)0x00,(byte)0x21,(byte)0x42,(byte)0x63,(byte)0x84,(byte)0xA5,(byte)0xC6,(byte)0xE7,(byte)0x08,(byte)0x29,(byte)0x4A,(byte)0x6B,(byte)0x8C,(byte)0xAD,(byte)0xCE,(byte)0xEF,
(byte)0x31,(byte)0x10,(byte)0x73,(byte)0x52,(byte)0xB5,(byte)0x94,(byte)0xF7,(byte)0xD6,(byte)0x39,(byte)0x18,(byte)0x7B,(byte)0x5A,(byte)0xBD,(byte)0x9C,(byte)0xFF,(byte)0xDE,
(byte)0x62,(byte)0x43,(byte)0x20,(byte)0x01,(byte)0xE6,(byte)0xC7,(byte)0xA4,(byte)0x85,(byte)0x6A,(byte)0x4B,(byte)0x28,(byte)0x09,(byte)0xEE,(byte)0xCF,(byte)0xAC,(byte)0x8D,
(byte)0x53,(byte)0x72,(byte)0x11,(byte)0x30,(byte)0xD7,(byte)0xF6,(byte)0x95,(byte)0xB4,(byte)0x5B,(byte)0x7A,(byte)0x19,(byte)0x38,(byte)0xDF,(byte)0xFE,(byte)0x9D,(byte)0xBC,
(byte)0xC4,(byte)0xE5,(byte)0x86,(byte)0xA7,(byte)0x40,(byte)0x61,(byte)0x02,(byte)0x23,(byte)0xCC,(byte)0xED,(byte)0x8E,(byte)0xAF,(byte)0x48,(byte)0x69,(byte)0x0A,(byte)0x2B,
(byte)0xF5,(byte)0xD4,(byte)0xB7,(byte)0x96,(byte)0x71,(byte)0x50,(byte)0x33,(byte)0x12,(byte)0xFD,(byte)0xDC,(byte)0xBF,(byte)0x9E,(byte)0x79,(byte)0x58,(byte)0x3B,(byte)0x1A,
(byte)0xA6,(byte)0x87,(byte)0xE4,(byte)0xC5,(byte)0x22,(byte)0x03,(byte)0x60,(byte)0x41,(byte)0xAE,(byte)0x8F,(byte)0xEC,(byte)0xCD,(byte)0x2A,(byte)0x0B,(byte)0x68,(byte)0x49,
(byte)0x97,(byte)0xB6,(byte)0xD5,(byte)0xF4,(byte)0x13,(byte)0x32,(byte)0x51,(byte)0x70,(byte)0x9F,(byte)0xBE,(byte)0xDD,(byte)0xFC,(byte)0x1B,(byte)0x3A,(byte)0x59,(byte)0x78,
(byte)0x88,(byte)0xA9,(byte)0xCA,(byte)0xEB,(byte)0x0C,(byte)0x2D,(byte)0x4E,(byte)0x6F,(byte)0x80,(byte)0xA1,(byte)0xC2,(byte)0xE3,(byte)0x04,(byte)0x25,(byte)0x46,(byte)0x67,
(byte)0xB9,(byte)0x98,(byte)0xFB,(byte)0xDA,(byte)0x3D,(byte)0x1C,(byte)0x7F,(byte)0x5E,(byte)0xB1,(byte)0x90,(byte)0xF3,(byte)0xD2,(byte)0x35,(byte)0x14,(byte)0x77,(byte)0x56,
(byte)0xEA,(byte)0xCB,(byte)0xA8,(byte)0x89,(byte)0x6E,(byte)0x4F,(byte)0x2C,(byte)0x0D,(byte)0xE2,(byte)0xC3,(byte)0xA0,(byte)0x81,(byte)0x66,(byte)0x47,(byte)0x24,(byte)0x05,
(byte)0xDB,(byte)0xFA,(byte)0x99,(byte)0xB8,(byte)0x5F,(byte)0x7E,(byte)0x1D,(byte)0x3C,(byte)0xD3,(byte)0xF2,(byte)0x91,(byte)0xB0,(byte)0x57,(byte)0x76,(byte)0x15,(byte)0x34,
(byte)0x4C,(byte)0x6D,(byte)0x0E,(byte)0x2F,(byte)0xC8,(byte)0xE9,(byte)0x8A,(byte)0xAB,(byte)0x44,(byte)0x65,(byte)0x06,(byte)0x27,(byte)0xC0,(byte)0xE1,(byte)0x82,(byte)0xA3,
(byte)0x7D,(byte)0x5C,(byte)0x3F,(byte)0x1E,(byte)0xF9,(byte)0xD8,(byte)0xBB,(byte)0x9A,(byte)0x75,(byte)0x54,(byte)0x37,(byte)0x16,(byte)0xF1,(byte)0xD0,(byte)0xB3,(byte)0x92,
(byte)0x2E,(byte)0x0F,(byte)0x6C,(byte)0x4D,(byte)0xAA,(byte)0x8B,(byte)0xE8,(byte)0xC9,(byte)0x26,(byte)0x07,(byte)0x64,(byte)0x45,(byte)0xA2,(byte)0x83,(byte)0xE0,(byte)0xC1,
(byte)0x1F,(byte)0x3E,(byte)0x5D,(byte)0x7C,(byte)0x9B,(byte)0xBA,(byte)0xD9,(byte)0xF8,(byte)0x17,(byte)0x36,(byte)0x55,(byte)0x74,(byte)0x93,(byte)0xB2,(byte)0xD1,(byte)0xF0
};
(byte)0x00,(byte)0x21,(byte)0x42,(byte)0x63,(byte)0x84,(byte)0xA5,(byte)0xC6,(byte)0xE7,(byte)0x08,(byte)0x29,(byte)0x4A,(byte)0x6B,(byte)0x8C,(byte)0xAD,(byte)0xCE,(byte)0xEF,
(byte)0x31,(byte)0x10,(byte)0x73,(byte)0x52,(byte)0xB5,(byte)0x94,(byte)0xF7,(byte)0xD6,(byte)0x39,(byte)0x18,(byte)0x7B,(byte)0x5A,(byte)0xBD,(byte)0x9C,(byte)0xFF,(byte)0xDE,
(byte)0x62,(byte)0x43,(byte)0x20,(byte)0x01,(byte)0xE6,(byte)0xC7,(byte)0xA4,(byte)0x85,(byte)0x6A,(byte)0x4B,(byte)0x28,(byte)0x09,(byte)0xEE,(byte)0xCF,(byte)0xAC,(byte)0x8D,
(byte)0x53,(byte)0x72,(byte)0x11,(byte)0x30,(byte)0xD7,(byte)0xF6,(byte)0x95,(byte)0xB4,(byte)0x5B,(byte)0x7A,(byte)0x19,(byte)0x38,(byte)0xDF,(byte)0xFE,(byte)0x9D,(byte)0xBC,
(byte)0xC4,(byte)0xE5,(byte)0x86,(byte)0xA7,(byte)0x40,(byte)0x61,(byte)0x02,(byte)0x23,(byte)0xCC,(byte)0xED,(byte)0x8E,(byte)0xAF,(byte)0x48,(byte)0x69,(byte)0x0A,(byte)0x2B,
(byte)0xF5,(byte)0xD4,(byte)0xB7,(byte)0x96,(byte)0x71,(byte)0x50,(byte)0x33,(byte)0x12,(byte)0xFD,(byte)0xDC,(byte)0xBF,(byte)0x9E,(byte)0x79,(byte)0x58,(byte)0x3B,(byte)0x1A,
(byte)0xA6,(byte)0x87,(byte)0xE4,(byte)0xC5,(byte)0x22,(byte)0x03,(byte)0x60,(byte)0x41,(byte)0xAE,(byte)0x8F,(byte)0xEC,(byte)0xCD,(byte)0x2A,(byte)0x0B,(byte)0x68,(byte)0x49,
(byte)0x97,(byte)0xB6,(byte)0xD5,(byte)0xF4,(byte)0x13,(byte)0x32,(byte)0x51,(byte)0x70,(byte)0x9F,(byte)0xBE,(byte)0xDD,(byte)0xFC,(byte)0x1B,(byte)0x3A,(byte)0x59,(byte)0x78,
(byte)0x88,(byte)0xA9,(byte)0xCA,(byte)0xEB,(byte)0x0C,(byte)0x2D,(byte)0x4E,(byte)0x6F,(byte)0x80,(byte)0xA1,(byte)0xC2,(byte)0xE3,(byte)0x04,(byte)0x25,(byte)0x46,(byte)0x67,
(byte)0xB9,(byte)0x98,(byte)0xFB,(byte)0xDA,(byte)0x3D,(byte)0x1C,(byte)0x7F,(byte)0x5E,(byte)0xB1,(byte)0x90,(byte)0xF3,(byte)0xD2,(byte)0x35,(byte)0x14,(byte)0x77,(byte)0x56,
(byte)0xEA,(byte)0xCB,(byte)0xA8,(byte)0x89,(byte)0x6E,(byte)0x4F,(byte)0x2C,(byte)0x0D,(byte)0xE2,(byte)0xC3,(byte)0xA0,(byte)0x81,(byte)0x66,(byte)0x47,(byte)0x24,(byte)0x05,
(byte)0xDB,(byte)0xFA,(byte)0x99,(byte)0xB8,(byte)0x5F,(byte)0x7E,(byte)0x1D,(byte)0x3C,(byte)0xD3,(byte)0xF2,(byte)0x91,(byte)0xB0,(byte)0x57,(byte)0x76,(byte)0x15,(byte)0x34,
(byte)0x4C,(byte)0x6D,(byte)0x0E,(byte)0x2F,(byte)0xC8,(byte)0xE9,(byte)0x8A,(byte)0xAB,(byte)0x44,(byte)0x65,(byte)0x06,(byte)0x27,(byte)0xC0,(byte)0xE1,(byte)0x82,(byte)0xA3,
(byte)0x7D,(byte)0x5C,(byte)0x3F,(byte)0x1E,(byte)0xF9,(byte)0xD8,(byte)0xBB,(byte)0x9A,(byte)0x75,(byte)0x54,(byte)0x37,(byte)0x16,(byte)0xF1,(byte)0xD0,(byte)0xB3,(byte)0x92,
(byte)0x2E,(byte)0x0F,(byte)0x6C,(byte)0x4D,(byte)0xAA,(byte)0x8B,(byte)0xE8,(byte)0xC9,(byte)0x26,(byte)0x07,(byte)0x64,(byte)0x45,(byte)0xA2,(byte)0x83,(byte)0xE0,(byte)0xC1,
(byte)0x1F,(byte)0x3E,(byte)0x5D,(byte)0x7C,(byte)0x9B,(byte)0xBA,(byte)0xD9,(byte)0xF8,(byte)0x17,(byte)0x36,(byte)0x55,(byte)0x74,(byte)0x93,(byte)0xB2,(byte)0xD1,(byte)0xF0
};
private static int get_crc16_ccitt(byte[] data, int len) {
int a =data[0] & 0x00ff;
int b =data[1] & 0x00ff;
int c =data[2] & 0x00ff;
for(int i=2;i<len;i++){
c =((la00[a]& 0x00ff) ^ c) ;
a =((ha00[a]& 0x00ff) ^ b) ;
b =c;
if (i==len-1) break;
c=(data[i+1] & 0x00ff);
}
return ((a & 0x00ff) << 8)|(b & 0x00ff) & 0xffff;
}
public static void main(String[] args) throws IOException {
//String test="e0e00024333539333639303830343735363135000000000018a920190704155205";
int a =data[0] & 0x00ff;
int b =data[1] & 0x00ff;
int c =data[2] & 0x00ff;
for(int i=2;i<len;i++){
c =((la00[a]& 0x00ff) ^ c) ;
a =((ha00[a]& 0x00ff) ^ b) ;
b =c;
if (i==len-1) break;
c=(data[i+1] & 0x00ff);
}
return ((a & 0x00ff) << 8)|(b & 0x00ff) & 0xffff;
}
public static void main(String[] args) throws IOException {
//String test="e0e00024333539333639303830343735363135000000000018a920190704155205";
String test="CBCAFF191C345EBCA89F0000000000E0E00022333539333639303832343439363236FFFFFFFFFF81BB1300000012340000362120190704101912";
byte[] buffer =DatatypeConverter.parseHexBinary(test);
int crc16 = half_crc.get_crc16_ccitt(buffer,buffer.length);
System.out.println(Integer.toHexString(crc16));
}
}
byte[] buffer =DatatypeConverter.parseHexBinary(test);
int crc16 = half_crc.get_crc16_ccitt(buffer,buffer.length);
System.out.println(Integer.toHexString(crc16));
}
}
//*************
C#版:
static byte[] ha00 = {
0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x81,0x91,0xA1,0xB1,0xC1,0xD1,0xE1,0xF1,
0x12,0x02,0x32,0x22,0x52,0x42,0x72,0x62,0x93,0x83,0xB3,0xA3,0xD3,0xC3,0xF3,0xE3,
0x24,0x34,0x04,0x14,0x64,0x74,0x44,0x54,0xA5,0xB5,0x85,0x95,0xE5,0xF5,0xC5,0xD5,
0x36,0x26,0x16,0x06,0x76,0x66,0x56,0x46,0xB7,0xA7,0x97,0x87,0xF7,0xE7,0xD7,0xC7,
0x48,0x58,0x68,0x78,0x08,0x18,0x28,0x38,0xC9,0xD9,0xE9,0xF9,0x89,0x99,0xA9,0xB9,
0x5A,0x4A,0x7A,0x6A,0x1A,0x0A,0x3A,0x2A,0xDB,0xCB,0xFB,0xEB,0x9B,0x8B,0xBB,0xAB,
0x6C,0x7C,0x4C,0x5C,0x2C,0x3C,0x0C,0x1C,0xED,0xFD,0xCD,0xDD,0xAD,0xBD,0x8D,0x9D,
0x7E,0x6E,0x5E,0x4E,0x3E,0x2E,0x1E,0x0E,0xFF,0xEF,0xDF,0xCF,0xBF,0xAF,0x9F,0x8F,
0x91,0x81,0xB1,0xA1,0xD1,0xC1,0xF1,0xE1,0x10,0x00,0x30,0x20,0x50,0x40,0x70,0x60,
0x83,0x93,0xA3,0xB3,0xC3,0xD3,0xE3,0xF3,0x02,0x12,0x22,0x32,0x42,0x52,0x62,0x72,
0xB5,0xA5,0x95,0x85,0xF5,0xE5,0xD5,0xC5,0x34,0x24,0x14,0x04,0x74,0x64,0x54,0x44,
0xA7,0xB7,0x87,0x97,0xE7,0xF7,0xC7,0xD7,0x26,0x36,0x06,0x16,0x66,0x76,0x46,0x56,
0xD9,0xC9,0xF9,0xE9,0x99,0x89,0xB9,0xA9,0x58,0x48,0x78,0x68,0x18,0x08,0x38,0x28,
0xCB,0xDB,0xEB,0xFB,0x8B,0x9B,0xAB,0xBB,0x4A,0x5A,0x6A,0x7A,0x0A,0x1A,0x2A,0x3A,
0xFD,0xED,0xDD,0xCD,0xBD,0xAD,0x9D,0x8D,0x7C,0x6C,0x5C,0x4C,0x3C,0x2C,0x1C,0x0C,
0xEF,0xFF,0xCF,0xDF,0xAF,0xBF,0x8F,0x9F,0x6E,0x7E,0x4E,0x5E,0x2E,0x3E,0x0E,0x1E};
static byte[] la00 = {
0x00,0x21,0x42,0x63,0x84,0xA5,0xC6,0xE7,0x08,0x29,0x4A,0x6B,0x8C,0xAD,0xCE,0xEF,
0x31,0x10,0x73,0x52,0xB5,0x94,0xF7,0xD6,0x39,0x18,0x7B,0x5A,0xBD,0x9C,0xFF,0xDE,
0x62,0x43,0x20,0x01,0xE6,0xC7,0xA4,0x85,0x6A,0x4B,0x28,0x09,0xEE,0xCF,0xAC,0x8D,
0x53,0x72,0x11,0x30,0xD7,0xF6,0x95,0xB4,0x5B,0x7A,0x19,0x38,0xDF,0xFE,0x9D,0xBC,
0xC4,0xE5,0x86,0xA7,0x40,0x61,0x02,0x23,0xCC,0xED,0x8E,0xAF,0x48,0x69,0x0A,0x2B,
0xF5,0xD4,0xB7,0x96,0x71,0x50,0x33,0x12,0xFD,0xDC,0xBF,0x9E,0x79,0x58,0x3B,0x1A,
0xA6,0x87,0xE4,0xC5,0x22,0x03,0x60,0x41,0xAE,0x8F,0xEC,0xCD,0x2A,0x0B,0x68,0x49,
0x97,0xB6,0xD5,0xF4,0x13,0x32,0x51,0x70,0x9F,0xBE,0xDD,0xFC,0x1B,0x3A,0x59,0x78,
0x88,0xA9,0xCA,0xEB,0x0C,0x2D,0x4E,0x6F,0x80,0xA1,0xC2,0xE3,0x04,0x25,0x46,0x67,
0xB9,0x98,0xFB,0xDA,0x3D,0x1C,0x7F,0x5E,0xB1,0x90,0xF3,0xD2,0x35,0x14,0x77,0x56,
0xEA,0xCB,0xA8,0x89,0x6E,0x4F,0x2C,0x0D,0xE2,0xC3,0xA0,0x81,0x66,0x47,0x24,0x05,
0xDB,0xFA,0x99,0xB8,0x5F,0x7E,0x1D,0x3C,0xD3,0xF2,0x91,0xB0,0x57,0x76,0x15,0x34,
0x4C,0x6D,0x0E,0x2F,0xC8,0xE9,0x8A,0xAB,0x44,0x65,0x06,0x27,0xC0,0xE1,0x82,0xA3,
0x7D,0x5C,0x3F,0x1E,0xF9,0xD8,0xBB,0x9A,0x75,0x54,0x37,0x16,0xF1,0xD0,0xB3,0x92,
0x2E,0x0F,0x6C,0x4D,0xAA,0x8B,0xE8,0xC9,0x26,0x07,0x64,0x45,0xA2,0x83,0xE0,0xC1,
0x1F,0x3E,0x5D,0x7C,0x9B,0xBA,0xD9,0xF8,0x17,0x36,0x55,0x74,0x93,0xB2,0xD1,0xF0
};
0x00,0x21,0x42,0x63,0x84,0xA5,0xC6,0xE7,0x08,0x29,0x4A,0x6B,0x8C,0xAD,0xCE,0xEF,
0x31,0x10,0x73,0x52,0xB5,0x94,0xF7,0xD6,0x39,0x18,0x7B,0x5A,0xBD,0x9C,0xFF,0xDE,
0x62,0x43,0x20,0x01,0xE6,0xC7,0xA4,0x85,0x6A,0x4B,0x28,0x09,0xEE,0xCF,0xAC,0x8D,
0x53,0x72,0x11,0x30,0xD7,0xF6,0x95,0xB4,0x5B,0x7A,0x19,0x38,0xDF,0xFE,0x9D,0xBC,
0xC4,0xE5,0x86,0xA7,0x40,0x61,0x02,0x23,0xCC,0xED,0x8E,0xAF,0x48,0x69,0x0A,0x2B,
0xF5,0xD4,0xB7,0x96,0x71,0x50,0x33,0x12,0xFD,0xDC,0xBF,0x9E,0x79,0x58,0x3B,0x1A,
0xA6,0x87,0xE4,0xC5,0x22,0x03,0x60,0x41,0xAE,0x8F,0xEC,0xCD,0x2A,0x0B,0x68,0x49,
0x97,0xB6,0xD5,0xF4,0x13,0x32,0x51,0x70,0x9F,0xBE,0xDD,0xFC,0x1B,0x3A,0x59,0x78,
0x88,0xA9,0xCA,0xEB,0x0C,0x2D,0x4E,0x6F,0x80,0xA1,0xC2,0xE3,0x04,0x25,0x46,0x67,
0xB9,0x98,0xFB,0xDA,0x3D,0x1C,0x7F,0x5E,0xB1,0x90,0xF3,0xD2,0x35,0x14,0x77,0x56,
0xEA,0xCB,0xA8,0x89,0x6E,0x4F,0x2C,0x0D,0xE2,0xC3,0xA0,0x81,0x66,0x47,0x24,0x05,
0xDB,0xFA,0x99,0xB8,0x5F,0x7E,0x1D,0x3C,0xD3,0xF2,0x91,0xB0,0x57,0x76,0x15,0x34,
0x4C,0x6D,0x0E,0x2F,0xC8,0xE9,0x8A,0xAB,0x44,0x65,0x06,0x27,0xC0,0xE1,0x82,0xA3,
0x7D,0x5C,0x3F,0x1E,0xF9,0xD8,0xBB,0x9A,0x75,0x54,0x37,0x16,0xF1,0xD0,0xB3,0x92,
0x2E,0x0F,0x6C,0x4D,0xAA,0x8B,0xE8,0xC9,0x26,0x07,0x64,0x45,0xA2,0x83,0xE0,0xC1,
0x1F,0x3E,0x5D,0x7C,0x9B,0xBA,0xD9,0xF8,0x17,0x36,0x55,0x74,0x93,0xB2,0xD1,0xF0
};
private static int get_crc16_ccitt(byte[] data, int len)
{
int a = data[0] & 0x00ff;
int b = data[1] & 0x00ff;
int c = data[2] & 0x00ff;
for (int i = 2; i < len; i++)
{
c = ((la00[a] & 0x00ff) ^ c);
a = ((ha00[a] & 0x00ff) ^ b);
b = c;
if (i == len - 1) break;
c = (data[i + 1] & 0x00ff);
}
return ((a & 0x00ff) << 8) | (b & 0x00ff) & 0xffff;
}
{
c = ((la00[a] & 0x00ff) ^ c);
a = ((ha00[a] & 0x00ff) ^ b);
b = c;
if (i == len - 1) break;
c = (data[i + 1] & 0x00ff);
}
return ((a & 0x00ff) << 8) | (b & 0x00ff) & 0xffff;
}
//************
C++ 版:
const unsigned char ha00[256] ={
0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x81,0x91,0xA1,0xB1,0xC1,0xD1,0xE1,0xF1,
0x12,0x02,0x32,0x22,0x52,0x42,0x72,0x62,0x93,0x83,0xB3,0xA3,0xD3,0xC3,0xF3,0xE3,
0x24,0x34,0x04,0x14,0x64,0x74,0x44,0x54,0xA5,0xB5,0x85,0x95,0xE5,0xF5,0xC5,0xD5,
0x36,0x26,0x16,0x06,0x76,0x66,0x56,0x46,0xB7,0xA7,0x97,0x87,0xF7,0xE7,0xD7,0xC7,
0x48,0x58,0x68,0x78,0x08,0x18,0x28,0x38,0xC9,0xD9,0xE9,0xF9,0x89,0x99,0xA9,0xB9,
0x5A,0x4A,0x7A,0x6A,0x1A,0x0A,0x3A,0x2A,0xDB,0xCB,0xFB,0xEB,0x9B,0x8B,0xBB,0xAB,
0x6C,0x7C,0x4C,0x5C,0x2C,0x3C,0x0C,0x1C,0xED,0xFD,0xCD,0xDD,0xAD,0xBD,0x8D,0x9D,
0x7E,0x6E,0x5E,0x4E,0x3E,0x2E,0x1E,0x0E,0xFF,0xEF,0xDF,0xCF,0xBF,0xAF,0x9F,0x8F,
0x91,0x81,0xB1,0xA1,0xD1,0xC1,0xF1,0xE1,0x10,0x00,0x30,0x20,0x50,0x40,0x70,0x60,
0x83,0x93,0xA3,0xB3,0xC3,0xD3,0xE3,0xF3,0x02,0x12,0x22,0x32,0x42,0x52,0x62,0x72,
0xB5,0xA5,0x95,0x85,0xF5,0xE5,0xD5,0xC5,0x34,0x24,0x14,0x04,0x74,0x64,0x54,0x44,
0xA7,0xB7,0x87,0x97,0xE7,0xF7,0xC7,0xD7,0x26,0x36,0x06,0x16,0x66,0x76,0x46,0x56,
0xD9,0xC9,0xF9,0xE9,0x99,0x89,0xB9,0xA9,0x58,0x48,0x78,0x68,0x18,0x08,0x38,0x28,
0xCB,0xDB,0xEB,0xFB,0x8B,0x9B,0xAB,0xBB,0x4A,0x5A,0x6A,0x7A,0x0A,0x1A,0x2A,0x3A,
0xFD,0xED,0xDD,0xCD,0xBD,0xAD,0x9D,0x8D,0x7C,0x6C,0x5C,0x4C,0x3C,0x2C,0x1C,0x0C,
0xEF,0xFF,0xCF,0xDF,0xAF,0xBF,0x8F,0x9F,0x6E,0x7E,0x4E,0x5E,0x2E,0x3E,0x0E,0x1E
};
0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x81,0x91,0xA1,0xB1,0xC1,0xD1,0xE1,0xF1,
0x12,0x02,0x32,0x22,0x52,0x42,0x72,0x62,0x93,0x83,0xB3,0xA3,0xD3,0xC3,0xF3,0xE3,
0x24,0x34,0x04,0x14,0x64,0x74,0x44,0x54,0xA5,0xB5,0x85,0x95,0xE5,0xF5,0xC5,0xD5,
0x36,0x26,0x16,0x06,0x76,0x66,0x56,0x46,0xB7,0xA7,0x97,0x87,0xF7,0xE7,0xD7,0xC7,
0x48,0x58,0x68,0x78,0x08,0x18,0x28,0x38,0xC9,0xD9,0xE9,0xF9,0x89,0x99,0xA9,0xB9,
0x5A,0x4A,0x7A,0x6A,0x1A,0x0A,0x3A,0x2A,0xDB,0xCB,0xFB,0xEB,0x9B,0x8B,0xBB,0xAB,
0x6C,0x7C,0x4C,0x5C,0x2C,0x3C,0x0C,0x1C,0xED,0xFD,0xCD,0xDD,0xAD,0xBD,0x8D,0x9D,
0x7E,0x6E,0x5E,0x4E,0x3E,0x2E,0x1E,0x0E,0xFF,0xEF,0xDF,0xCF,0xBF,0xAF,0x9F,0x8F,
0x91,0x81,0xB1,0xA1,0xD1,0xC1,0xF1,0xE1,0x10,0x00,0x30,0x20,0x50,0x40,0x70,0x60,
0x83,0x93,0xA3,0xB3,0xC3,0xD3,0xE3,0xF3,0x02,0x12,0x22,0x32,0x42,0x52,0x62,0x72,
0xB5,0xA5,0x95,0x85,0xF5,0xE5,0xD5,0xC5,0x34,0x24,0x14,0x04,0x74,0x64,0x54,0x44,
0xA7,0xB7,0x87,0x97,0xE7,0xF7,0xC7,0xD7,0x26,0x36,0x06,0x16,0x66,0x76,0x46,0x56,
0xD9,0xC9,0xF9,0xE9,0x99,0x89,0xB9,0xA9,0x58,0x48,0x78,0x68,0x18,0x08,0x38,0x28,
0xCB,0xDB,0xEB,0xFB,0x8B,0x9B,0xAB,0xBB,0x4A,0x5A,0x6A,0x7A,0x0A,0x1A,0x2A,0x3A,
0xFD,0xED,0xDD,0xCD,0xBD,0xAD,0x9D,0x8D,0x7C,0x6C,0x5C,0x4C,0x3C,0x2C,0x1C,0x0C,
0xEF,0xFF,0xCF,0xDF,0xAF,0xBF,0x8F,0x9F,0x6E,0x7E,0x4E,0x5E,0x2E,0x3E,0x0E,0x1E
};
const unsigned char la00[256] ={
0x00,0x21,0x42,0x63,0x84,0xA5,0xC6,0xE7,0x08,0x29,0x4A,0x6B,0x8C,0xAD,0xCE,0xEF,
0x31,0x10,0x73,0x52,0xB5,0x94,0xF7,0xD6,0x39,0x18,0x7B,0x5A,0xBD,0x9C,0xFF,0xDE,
0x62,0x43,0x20,0x01,0xE6,0xC7,0xA4,0x85,0x6A,0x4B,0x28,0x09,0xEE,0xCF,0xAC,0x8D,
0x53,0x72,0x11,0x30,0xD7,0xF6,0x95,0xB4,0x5B,0x7A,0x19,0x38,0xDF,0xFE,0x9D,0xBC,
0xC4,0xE5,0x86,0xA7,0x40,0x61,0x02,0x23,0xCC,0xED,0x8E,0xAF,0x48,0x69,0x0A,0x2B,
0xF5,0xD4,0xB7,0x96,0x71,0x50,0x33,0x12,0xFD,0xDC,0xBF,0x9E,0x79,0x58,0x3B,0x1A,
0xA6,0x87,0xE4,0xC5,0x22,0x03,0x60,0x41,0xAE,0x8F,0xEC,0xCD,0x2A,0x0B,0x68,0x49,
0x97,0xB6,0xD5,0xF4,0x13,0x32,0x51,0x70,0x9F,0xBE,0xDD,0xFC,0x1B,0x3A,0x59,0x78,
0x88,0xA9,0xCA,0xEB,0x0C,0x2D,0x4E,0x6F,0x80,0xA1,0xC2,0xE3,0x04,0x25,0x46,0x67,
0xB9,0x98,0xFB,0xDA,0x3D,0x1C,0x7F,0x5E,0xB1,0x90,0xF3,0xD2,0x35,0x14,0x77,0x56,
0xEA,0xCB,0xA8,0x89,0x6E,0x4F,0x2C,0x0D,0xE2,0xC3,0xA0,0x81,0x66,0x47,0x24,0x05,
0xDB,0xFA,0x99,0xB8,0x5F,0x7E,0x1D,0x3C,0xD3,0xF2,0x91,0xB0,0x57,0x76,0x15,0x34,
0x4C,0x6D,0x0E,0x2F,0xC8,0xE9,0x8A,0xAB,0x44,0x65,0x06,0x27,0xC0,0xE1,0x82,0xA3,
0x7D,0x5C,0x3F,0x1E,0xF9,0xD8,0xBB,0x9A,0x75,0x54,0x37,0x16,0xF1,0xD0,0xB3,0x92,
0x2E,0x0F,0x6C,0x4D,0xAA,0x8B,0xE8,0xC9,0x26,0x07,0x64,0x45,0xA2,0x83,0xE0,0xC1,
0x1F,0x3E,0x5D,0x7C,0x9B,0xBA,0xD9,0xF8,0x17,0x36,0x55,0x74,0x93,0xB2,0xD1,0xF0
};
0x00,0x21,0x42,0x63,0x84,0xA5,0xC6,0xE7,0x08,0x29,0x4A,0x6B,0x8C,0xAD,0xCE,0xEF,
0x31,0x10,0x73,0x52,0xB5,0x94,0xF7,0xD6,0x39,0x18,0x7B,0x5A,0xBD,0x9C,0xFF,0xDE,
0x62,0x43,0x20,0x01,0xE6,0xC7,0xA4,0x85,0x6A,0x4B,0x28,0x09,0xEE,0xCF,0xAC,0x8D,
0x53,0x72,0x11,0x30,0xD7,0xF6,0x95,0xB4,0x5B,0x7A,0x19,0x38,0xDF,0xFE,0x9D,0xBC,
0xC4,0xE5,0x86,0xA7,0x40,0x61,0x02,0x23,0xCC,0xED,0x8E,0xAF,0x48,0x69,0x0A,0x2B,
0xF5,0xD4,0xB7,0x96,0x71,0x50,0x33,0x12,0xFD,0xDC,0xBF,0x9E,0x79,0x58,0x3B,0x1A,
0xA6,0x87,0xE4,0xC5,0x22,0x03,0x60,0x41,0xAE,0x8F,0xEC,0xCD,0x2A,0x0B,0x68,0x49,
0x97,0xB6,0xD5,0xF4,0x13,0x32,0x51,0x70,0x9F,0xBE,0xDD,0xFC,0x1B,0x3A,0x59,0x78,
0x88,0xA9,0xCA,0xEB,0x0C,0x2D,0x4E,0x6F,0x80,0xA1,0xC2,0xE3,0x04,0x25,0x46,0x67,
0xB9,0x98,0xFB,0xDA,0x3D,0x1C,0x7F,0x5E,0xB1,0x90,0xF3,0xD2,0x35,0x14,0x77,0x56,
0xEA,0xCB,0xA8,0x89,0x6E,0x4F,0x2C,0x0D,0xE2,0xC3,0xA0,0x81,0x66,0x47,0x24,0x05,
0xDB,0xFA,0x99,0xB8,0x5F,0x7E,0x1D,0x3C,0xD3,0xF2,0x91,0xB0,0x57,0x76,0x15,0x34,
0x4C,0x6D,0x0E,0x2F,0xC8,0xE9,0x8A,0xAB,0x44,0x65,0x06,0x27,0xC0,0xE1,0x82,0xA3,
0x7D,0x5C,0x3F,0x1E,0xF9,0xD8,0xBB,0x9A,0x75,0x54,0x37,0x16,0xF1,0xD0,0xB3,0x92,
0x2E,0x0F,0x6C,0x4D,0xAA,0x8B,0xE8,0xC9,0x26,0x07,0x64,0x45,0xA2,0x83,0xE0,0xC1,
0x1F,0x3E,0x5D,0x7C,0x9B,0xBA,0xD9,0xF8,0x17,0x36,0x55,0x74,0x93,0xB2,0xD1,0xF0
};
void CRC16_ccitt(unsigned char *a,unsigned char *b,unsigned char *c)
{
*c = la00[*a] ^ *c;
*a = ha00[*a] ^ *b;
*b = *c;
}