C++
int get_crc16 (unsigned char *bufData, unsigned int buflen, unsigned char *pcrc) { int ret = 0; unsigned short CRC = 0xffff; unsigned short POLYNOMIAL = 0xa001; int i, j; if(bufData == NULL || pcrc == NULL) { return -1; } if (buflen == 0) { return ret; } for (i = 0; i < buflen; i++) { CRC ^= bufData[i]; for (j = 0; j < 8; j++) { if ((CRC & 0x0001) != 0) { CRC >>= 1; CRC ^= POLYNOMIAL; } else { CRC >>= 1; } } } printf ("CRC=%X\n", CRC); pcrc[0] = (unsigned char)(CRC & 0x00ff); pcrc[1] = (unsigned char)(CRC >> 8); return ret; } int main(int argc, char *argv[]) { unsigned char cc[]={0x30,0x30,0x34,0x36,0x46,0x44,0x36,0x30,0x30,0x30,0x01,0x72,0x65, 0x66,0x65,0x72,0x69,0x6E,0x66,0x6F,0x2E,0x63,0x73,0x76,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x01,0xf4,0x01}; //unsigned char cc[] = {0x00, 0xff}; unsigned char crcs[3] = {0}; int ret = get_crc16 (cc, 46, crcs); printf("ret = %d\n", ret); return 0; }
public static int get_crc16 (byte[] bufData, int buflen, byte[] pcrc) { int ret = 0; int CRC = 0x0000ffff; int POLYNOMIAL = 0x0000a001; int i, j; if (buflen == 0) { return ret; } for (i = 0; i < buflen; i++) { CRC ^= ((int)bufData[i] & 0x000000ff); for (j = 0; j < 8; j++) { if ((CRC & 0x00000001) != 0) { CRC >>= 1; CRC ^= POLYNOMIAL; } else { CRC >>= 1; } } //System.out.println(Integer.toHexString(CRC)); } System.out.println(Integer.toHexString(CRC)); pcrc[0] = (byte)(CRC & 0x00ff); pcrc[1] = (byte)(CRC >> 8); return ret; } /** * @param args */ public static void main(String[] args) { byte[] aa = {0x30,0x30,0x34,0x36,0x46,0x44,0x36,0x30,0x30,0x30,0x01,0x72,0x65, 0x66,0x65,0x72,0x69,0x6E,0x66,0x6F,0x2E,0x63,0x73,0x76,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x01,(byte)0xf4,0x01}; byte[] bb = new byte[3]; Crc16.get_crc16(aa, aa.length, bb); System.out.println(Integer.toHexString((int)bb[0] & 0x000000ff)); System.out.println(Integer.toHexString((int)bb[1] & 0x000000ff)); }
验证工具:SinloCRC16效验小工具(度娘一下)