/**
* CRC16 Related calculations
CRC-16 x16+x15+x2+1 8005 IBM SDLC
* Encode:utf-8
*
* @author TRB
* @date 2014-12-25
*/
public class CRC16 {
Static byte[] Crc16_tab_h = {(byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, ( BYTE) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x00, (byte) 0xC1 , (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (by TE) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (byte) 0 X01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (byte) 0xC0, (byte) 0x80, (Byte) 0x41, (Byte) 0x01, (byte) 0xC0,
(byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (byte ) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (byte) 0x0 1, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (b Yte) 0x80, (Byte) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (byte) 0x01, (byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (byt e) 0x80, (Byte) 0x41, (Byte) 0x00, (byte) 0xC1,
(byte) 0x81, (Byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (byte ) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (byte) 0x0 0, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (b Yte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (byte) 0x01, (byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (byt e) 0x81, (Byte) 0x40, (Byte) 0x01, (byte) 0xC0,
(byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (byte ) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (byte) 0x0 1, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (b Yte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (byte) 0x01, (byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x00, (Byte) 0xC1, (byt e) 0x81, (Byte) 0x40, (Byte) 0x01, (byte) 0xC0,
(byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (Byte) 0x40, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (byte ) 0x41, (Byte) 0x01, (Byte) 0xC0, (Byte) 0x80, (Byte) 0x41, (Byte) 0x00, (Byte) 0xC1, (Byte) 0x81, (byte) 0x40};
Static byte[] crc16_tab_l = {(byte) 0x00, (Byte) 0xC0, (Byte) 0xC1, (Byte) 0x01, (Byte) 0xC3, (Byte) 0x03, (Byte) 0x02, ( BYTE) 0xC2, (Byte) 0xC6, (Byte) 0x06, (Byte) 0x07, (Byte) 0xC7, (Byte) 0x05, (Byte) 0xC5, (Byte) 0xc4, (Byte) 0x04, (byte) 0xCC, (Byte) 0x0C, (Byte) 0x0D, (Byte) 0xCD, (Byte) 0x0F, (Byte) 0xCF, (Byte) 0xCE, (Byte) 0x0E, (Byte) 0x0A, (byte) 0xCA , (Byte) 0xCB, (Byte) 0x0B, (Byte) 0xc9, (Byte) 0x09, (Byte) 0x08, (Byte) 0xC8, (Byte) 0xd8, (Byte) 0x18, (Byte) 0x19, (by TE) 0xd9, (Byte) 0x1B, (Byte) 0xDB, (Byte) 0xDA, (Byte) 0x1A, (Byte) 0x1E, (Byte) 0xDE, (Byte) 0xDF, (Byte) 0x1F, (byte) 0 XDD, (Byte) 0x1D, (Byte) 0x1C, (Byte) 0xDC, (Byte) 0x14, (Byte) 0xd4, (Byte) 0xd5, (Byte) 0x15, (Byte) 0xD7, (byte) 0x17, (byte) 0x16, (Byte) 0xd6, (Byte) 0xd2, (byte) 0x12,
(byte) 0x13, (Byte) 0xd3, (Byte) 0x11, (Byte) 0xD1, (Byte) 0xD0, (Byte) 0x10, (Byte) 0xF0, (Byte) 0x30, (Byte) 0x31, (byte ) 0xF1, (Byte) 0x33, (Byte) 0xf3, (Byte) 0xF2, (Byte) 0x32, (Byte) 0x36, (Byte) 0xf6, (Byte) 0xf7, (Byte) 0x37, (byte) 0xF 5, (Byte) 0x35, (Byte) 0x34, (Byte) 0xf4, (Byte) 0x3C, (Byte) 0xFC, (Byte) 0xFD, (Byte) 0x3d, (Byte) 0xFF, (Byte) 0x3F, (b Yte) 0x3e, (Byte) 0xFE, (Byte) 0xFA, (Byte) 0x3A, (Byte) 0x3B, (Byte) 0xFB, (Byte) 0x39, (Byte) 0xf9, (Byte) 0xF8, (byte) 0x38, (Byte) 0x28, (Byte) 0xe8, (Byte) 0xe9, (Byte) 0x29, (Byte) 0xEB, (Byte) 0x2B, (Byte) 0x2A, (Byte) 0xEA, (byte) 0xEE, (byte) 0x2e, (Byte) 0x2F, (Byte) 0xEF, (Byte) 0x2D, (Byte) 0xED, (Byte) 0xEC, (Byte) 0x2C, (Byte) 0xE4, (Byte) 0x24, (byt e) 0x25, (Byte) 0xe5, (Byte) 0x27, (byte) 0xE7,
(byte) 0xe6, (Byte) 0x26, (Byte) 0x22, (Byte) 0xe2, (Byte) 0xe3, (Byte) 0x23, (Byte) 0xe1, (Byte) 0x21, (Byte) 0x20, (byte ) 0xE0, (Byte) 0xA0, (Byte) 0x60, (Byte) 0x61, (Byte) 0xa1, (Byte) 0x63, (Byte) 0xa3, (Byte) 0xa2, (Byte) 0x62, (byte) 0x6 6, (Byte) 0xa6, (Byte) 0xa7, (Byte) 0x67, (Byte) 0xa5, (Byte) 0x65, (Byte) 0x64, (Byte) 0xa4, (Byte) 0x6c, (Byte) 0xAC, (b Yte) 0xAD, (Byte) 0x6d, (Byte) 0xAF, (Byte) 0x6F, (Byte) 0x6e, (Byte) 0xAE, (Byte) 0xAA, (Byte) 0x6A, (Byte) 0x6b, (byte) 0xAB, (Byte) 0x69, (Byte) 0xa9, (Byte) 0xa8, (Byte) 0x68, (Byte) 0x78, (Byte) 0xb8, (Byte) 0xb9, (Byte) 0x79, (byte) 0xBB, (byte) 0x7B, (Byte) 0x7A, (Byte) 0xBA, (Byte) 0xBE, (Byte) 0x7E, (Byte) 0x7F, (Byte) 0xBF, (Byte) 0x7d, (Byte) 0xBD, (byt e) 0xBC, (Byte) 0x7C, (Byte) 0xb4, (byte) 0x74,
(byte) 0x75, (Byte) 0xb5, (Byte) 0x77, (Byte) 0xb7, (Byte) 0xb6, (Byte) 0x76, (Byte) 0x72, (Byte) 0xb2, (Byte) 0xb3, (byte ) 0x73, (Byte) 0xb1, (Byte) 0x71, (Byte) 0x70, (Byte) 0xb0, (Byte) 0x50, (Byte) 0x90, (Byte) 0x91, (Byte) 0x51, (byte) 0x9 3, (Byte) 0x53, (Byte) 0x52, (Byte) 0x92, (Byte) 0x96, (Byte) 0x56, (Byte) 0x57, (Byte) 0x97, (Byte) 0x55, (Byte) 0x95, (b Yte) 0x94, (Byte) 0x54, (Byte) 0x9c, (Byte) 0x5C, (Byte) 0x5d, (Byte) 0x9d, (Byte) 0x5f, (Byte) 0x9F, (Byte) 0x9E, (byte) 0x5E, (Byte) 0x5A, (Byte) 0x9a, (Byte) 0x9b, (Byte) 0x5b, (Byte) 0x99, (Byte) 0x59, (Byte) 0x58, (Byte) 0x98, (byte) 0x88, (byte) 0x48, (Byte) 0x49, (Byte) 0x89, (Byte) 0x4B, (Byte) 0x8b, (Byte) 0x8A, (Byte) 0x4A, (Byte) 0x4E, (Byte) 0x8E, (byt e) 0x8F, (Byte) 0x4f, (Byte) 0x8d, (byte) 0x4d,
(byte) 0x4C, (Byte) 0x8c, (Byte) 0x44, (Byte) 0x84, (Byte) 0x85, (Byte) 0x45, (Byte) 0x87, (Byte) 0x47, (Byte) 0x46, (byte ) 0x86, (Byte) 0x82, (Byte) 0x42, (Byte) 0x43, (Byte) 0x83, (Byte) 0x41, (Byte) 0x81, (Byte) 0x80, (byte) 0x40};
/**
* Calculate CRC16 Check
*
* @param data
* Arrays that need to be computed
* @return CRC16 Checksum value
*/
public static int CALCCRC16 (byte[] data) {
return CALCCRC16 (data, 0, data.length);
}
/**
* Calculate CRC16 Check
*
* @param data
* Arrays that need to be computed
* @param offset
* Start position
* @param len
* Length
* @return CRC16 Checksum value
*/
public static int CALCCRC16 (byte[] data, int offset, int len) {
return CALCCRC16 (data, offset, Len, 0xffff);
}
/**
* Calculate CRC16 Check
*
* @param data
* Arrays that need to be computed
* @param offset
* Start position
* @param len
* Length
* @param preval
* Previous checksum value
* @return CRC16 Checksum value
*/
public static int CALCCRC16 (byte[] data, int offset, int len, int preval) {
int Uccrchi = (Preval & 0xff00) >> 8;
int uccrclo = Preval & 0x00ff;
int iIndex;
for (int i = 0; i < len; ++i) {
IIndex = (uccrclo ^ Data[offset + i]) & 0x00ff;
Uccrclo = Uccrchi ^ Crc16_tab_h[iindex];
Uccrchi = Crc16_tab_l[iindex];
}
Return ((Uccrchi & 0X00FF) << 8) | (Uccrclo & 0x00ff) & 0xFFFF;
}
public static char Crc16calc (byte[] data_arr, int data_len)
{
char CRC16 = 0;
int i;
for (i =0; i < (Data_len); i++)
{
CRC16 = (char) ((CRC16 >> 8) | (CRC16 << 8));
CRC16 ^= data_arr[i]& 0xFF;
CRC16 ^= (char) ((CRC16 & 0xFF) >> 4);
CRC16 ^= (char) ((CRC16 << 8) << 4);
CRC16 ^= (char) (((CRC16 & 0xFF) << 4) << 1);
}
return CRC16;
}
private static String GETCRC (byte[] data) {
int high;
int flag;
16-bit registers, all digits are 1
int WCRC = 0xFFFF;
for (int i = 0; i < data.length; i++) {
High byte of 16-bit register
High = WCRC >> 8;
The "XOR" operation of a byte of the checked string with the high byte of the 16-bit register
WCRC = high ^ data[i];
for (int j = 0; J < 8; J + +) {
Flag = WCRC & 0x0001;
Move this 16 register to the right one
WCRC = WCRC >> 1;
If the number of digits moved to the right (marker bit) is 1, then the polynomial 1010 0000 0000 0001 is generated and the register is "XOR"
if (flag = = 1)
WCRC ^= 0xa001;
}
}
Return integer.tohexstring (WCRC);
}
Test
public static String getcrc (byte[] bytes) {
int CRC = 0X0000FFFF;
int polynomial = 0x0000a001;
int I, J;
for (i = 0; i < bytes.length; i++) {
CRC ^= ((int) bytes[i] & 0X000000FF);
for (j = 0; J < 8; J + +) {
if (CRC & 0x00000001)! = 0) {
CRC >>= 1;
CRC ^= polynomial;
} else {
CRC >>= 1;
}
}
}
Return integer.tohexstring (CRC);
}
public static void Main (string[] args) {
crc_8005
0x02 (FF), crc16=7c 09
int CRC = CRC16.CALCCRC16 (New byte[] {0x02, 0x05, 0x00, 0x03, (byte) 0xFF, 0x00});
System.out.println (String.Format ("0x%04x", CRC));
}
}
Java, CRC (type 8005, x16+x15+x2+1)