【Java】CRC8Utils(CRC-8 工具类)

Java CRC-8 工具类

/**
 * CRC-8
 * 
 * 
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 * 
名称多项式初始值异或值Bit反转
  CRC-80x070x000x00MSB First
  CRC-8/DARC0x390x000x00LSB First
  CRC-8/ITU0x070x000x55MSB First
  CRC-8/MAXIM0x310x000x00LSB First
  CRC-8/ROHC0x070xFF0x00LSB First
* * @author unnamed * */
public class CRC8Utils { /** * CRC-8 * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x070x000x00MSB First
* * @param source * @param offset * @param length * @return */
public static int CRC8(byte[] source, int offset, int length) { int wCRCin = 0x00; int wCPoly = 0x07; 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 c07 = ((wCRCin >> 7 & 1) == 1); wCRCin <<= 1; if (c07 ^ bit) wCRCin ^= wCPoly; } } wCRCin &= 0xFF; return wCRCin ^= 0x00; } /** * CRC-8/DARC * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x390x000x00LSB First
* * @param source * @param offset * @param length * @return */
public static int CRC8_DARC(byte[] source, int offset, int length) { int wCRCin = 0x00; // Integer.reverse(0x39) >>> 24 int wCPoly = 0x9C; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((long) source[i] & 0xFF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x01) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0x00; } /** * CRC-8/ITU * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x070x000x55MSB First
* * @param source * @param offset * @param length * @return */
public static int CRC8_ITU(byte[] source, int offset, int length) { int wCRCin = 0x00; int wCPoly = 0x07; 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 c07 = ((wCRCin >> 7 & 1) == 1); wCRCin <<= 1; if (c07 ^ bit) wCRCin ^= wCPoly; } } wCRCin &= 0xFF; return wCRCin ^= 0x55; } /** * CRC-8/MAXIM * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x310x000x00LSB First
* * @param source * @param offset * @param length * @return */
public static int CRC8_MAXIM(byte[] source, int offset, int length) { int wCRCin = 0x00; // Integer.reverse(0x31) >>> 24 int wCPoly = 0x8C; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((long) source[i] & 0xFF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x01) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0x00; } /** * CRC-8/ROHC * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x070xFF0x00LSB First
* * @param source * @param offset * @param length * @return */
public static int CRC8_ROHC(byte[] source, int offset, int length) { int wCRCin = 0xFF; // Integer.reverse(0x07) >>> 24 int wCPoly = 0xE0; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((long) source[i] & 0xFF); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x01) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0x00; } }

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