【Java】CRC16Utils(CRC-16 工具类)

Java CRC-16 工具类

/**
 * CRC-16
 * 
 * 
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 * 
名称多项式初始值异或值Bit反转
  CRC-16/IBM0x80050x00000x0000LSB First
  CRC-16/CCITT0x10210x00000x0000LSB First
  CRC-16/CCITT-FALSE0x10210xFFFF0x0000MSB First
  CRC-16/DECT R0x05890x00000x0001MSB First
  CRC-16/DECT X0x05890x00000x0000MSB First
  CRC-16/DNP0x3D650x00000xFFFFLSB First
  CRC-16/GENIBUS0x10210xFFFF0xFFFFMSB First
  CRC-16/MAXIM0x80050x00000xFFFFLSB First
  CRC-16/MODBUS0x80050xFFFF0x0000LSB First
  CRC-16/USB0x80050xFFFF0xFFFFLSB First
  CRC-16/X250x10210xFFFF0xFFFFLSB First
  CRC-16/XMODEM0x10210x00000x0000MSB First
* * @author unnamed * */
public class CRC16Utils { /** * CRC-16/IBM * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x80050x00000x0000LSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_IBM(byte[] source, int offset, int length) { int wCRCin = 0x0000; // Integer.reverse(0x8005) >>> 16 int wCPoly = 0xA001; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((int) source[i] & 0x00FF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x0001) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0x0000; } /** * CRC-16/CCITT * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x10210x00000x0000LSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_CCITT(byte[] source, int offset, int length) { int wCRCin = 0x0000; // Integer.reverse(0x1021) >>> 16 int wCPoly = 0x8408; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((int) source[i] & 0x00FF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x0001) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0x0000; } /** * CRC-16/CCITT-FALSE * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x10210xFFFF0x0000MSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_CCITT_FALSE(byte[] source, int offset, int length) { int wCRCin = 0xFFFF; int wCPoly = 0x1021; for (int i = offset, cnt = offset + length; i < cnt; i++) { for (int j = 0; j < 8; j++) { boolean bit = ((source[i] >> (7 - j) & 1) == 1); boolean c15 = ((wCRCin >> 15 & 1) == 1); wCRCin <<= 1; if (c15 ^ bit) wCRCin ^= wCPoly; } } wCRCin &= 0xFFFF; return wCRCin ^= 0x0000; } /** * CRC-16/DECT R * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x05890x00000x0001MSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_DECT_R(byte[] source, int offset, int length) { int wCRCin = 0x0000; int wCPoly = 0x0589; for (int i = offset, cnt = offset + length; i < cnt; i++) { for (int j = 0; j < 8; j++) { boolean bit = ((source[i] >> (7 - j) & 1) == 1); boolean c15 = ((wCRCin >> 15 & 1) == 1); wCRCin <<= 1; if (c15 ^ bit) wCRCin ^= wCPoly; } } wCRCin &= 0xFFFF; return wCRCin ^= 0x0001; } /** * CRC-16/DECT X * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x05890x00000x0000MSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_DECT_X(byte[] source, int offset, int length) { int wCRCin = 0x0000; int wCPoly = 0x0589; for (int i = offset, cnt = offset + length; i < cnt; i++) { for (int j = 0; j < 8; j++) { boolean bit = ((source[i] >> (7 - j) & 1) == 1); boolean c15 = ((wCRCin >> 15 & 1) == 1); wCRCin <<= 1; if (c15 ^ bit) wCRCin ^= wCPoly; } } wCRCin &= 0xFFFF; return wCRCin ^= 0x0000; } /** * CRC-16/DNP * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x3D650x00000xFFFFLSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_DNP(byte[] source, int offset, int length) { int wCRCin = 0x0000; // Integer.reverse(0x3D65) >>> 16 int wCPoly = 0xA6BC; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((int) source[i] & 0x00FF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x0001) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0xFFFF; } /** * CRC-16/GENIBUS * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x10210xFFFF0xFFFFMSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_GENIBUS(byte[] source, int offset, int length) { int wCRCin = 0xFFFF; int wCPoly = 0x1021; for (int i = offset, cnt = offset + length; i < cnt; i++) { for (int j = 0; j < 8; j++) { boolean bit = ((source[i] >> (7 - j) & 1) == 1); boolean c15 = ((wCRCin >> 15 & 1) == 1); wCRCin <<= 1; if (c15 ^ bit) wCRCin ^= wCPoly; } } wCRCin &= 0xFFFF; return wCRCin ^= 0xFFFF; } /** * CRC-16/MAXIM * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x80050x00000xFFFFLSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_MAXIM(byte[] source, int offset, int length) { int wCRCin = 0x0000; // Integer.reverse(0x8005) >>> 16 int wCPoly = 0xA001; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((int) source[i] & 0x00FF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x0001) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0xFFFF; } /** * CRC-16/MODBUS * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x80050xFFFF0x0000LSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_MODBUS(byte[] source, int offset, int length) { int wCRCin = 0xFFFF; // Integer.reverse(0x8005) >>> 16 int wCPoly = 0xA001; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((int) source[i] & 0x00FF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x0001) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0x0000; } /** * CRC-16/USB * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x80050xFFFF0xFFFFLSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_USB(byte[] source, int offset, int length) { int wCRCin = 0xFFFF; // Integer.reverse(0x8005) >>> 16 int wCPoly = 0xA001; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((int) source[i] & 0x00FF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x0001) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0xFFFF; } /** * CRC-16/X25 * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x10210xFFFF0xFFFFLSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_X25(byte[] source, int offset, int length) { int wCRCin = 0xFFFF; // Integer.reverse(0x1021) >>> 16 int wCPoly = 0x8408; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((int) source[i] & 0x00FF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x0001) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0xFFFF; } /** * CRC-16/XMODEM * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x10210x00000x0000MSB First
* * @param source * @param offset * @param length * @return */
public static int CRC16_XMODEM(byte[] source, int offset, int length) { int wCRCin = 0x0000; int wCPoly = 0x1021; for (int i = offset, cnt = offset + length; i < cnt; i++) { for (int j = 0; j < 8; j++) { boolean bit = ((source[i] >> (7 - j) & 1) == 1); boolean c15 = ((wCRCin >> 15 & 1) == 1); wCRCin <<= 1; if (c15 ^ bit) wCRCin ^= wCPoly; } } wCRCin &= 0xFFFF; return wCRCin ^= 0x0000; } }

你可能感兴趣的:(Java,Java,Checksum,CRC,CRC16)