【Java】CRC32Utils(CRC-32 工具类)

Java CRC-32 工具类

/**
 * CRC-32
 * 
 * 
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 *     
 *         
 *         
 *         
 *         
 *         
 *     
 * 
名称多项式初始值异或值Bit反转
  CRC-320x04C11DB70xFFFFFFFF0xFFFFFFFFLSB First
  CRC-32/B0x04C11DB70xFFFFFFFF0xFFFFFFFFMSB First
  CRC-32/C0x1EDC6F410xFFFFFFFF0xFFFFFFFFLSB First
  CRC-32/D0xA833982B0xFFFFFFFF0xFFFFFFFFLSB First
  CRC-32/MPEG-20x04C11DB70xFFFFFFFF0x00000000MSB First
  CRC-32/POSIX0x04C11DB70x000000000xFFFFFFFFMSB First
* * @author unnamed * */
public class CRC32Utils { /** * CRC-32 * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x04C11DB70xFFFFFFFF0xFFFFFFFFLSB First
* * @param source * @param offset * @param length * @return */
public static long CRC32(byte[] source, int offset, int length) { long wCRCin = 0xFFFFFFFFL; // Long.reverse(0x04C11DB7L) >>> 32 long wCPoly = 0xEDB88320L; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((long) source[i] & 0x000000FFL); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x00000001L) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0xFFFFFFFFL; } /** * CRC-32/B * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x04C11DB70xFFFFFFFF0xFFFFFFFFMSB First
* * @param source * @param offset * @param length * @return */
public static long CRC32_B(byte[] source, int offset, int length) { long wCRCin = 0xFFFFFFFFL; long wCPoly = 0x04C11DB7L; 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 c31 = ((wCRCin >> 31 & 1) == 1); wCRCin <<= 1; if (c31 ^ bit) { wCRCin ^= wCPoly; } } } wCRCin &= 0xFFFFFFFFL; return wCRCin ^= 0xFFFFFFFFL; } /** * CRC-32/C * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x1EDC6F410xFFFFFFFF0xFFFFFFFFLSB First
* * @param source * @param offset * @param length * @return */
public static long CRC32_C(byte[] source, int offset, int length) { long wCRCin = 0xFFFFFFFFL; // Long.reverse(0x1EDC6F41L) >>> 32 long wCPoly = 0x82F63B78L; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((long) source[i] & 0x000000FFL); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x00000001L) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0xFFFFFFFFL; } /** * CRC-32/D * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0xA833982B0xFFFFFFFF0xFFFFFFFFLSB First
* * @param source * @param offset * @param length * @return */
public static long CRC32_D(byte[] source, int offset, int length) { long wCRCin = 0xFFFFFFFFL; // Long.reverse(0xA833982BL) >>> 32 long wCPoly = 0xD419CC15L; for (int i = offset, cnt = offset + length; i < cnt; i++) { wCRCin ^= ((long) source[i] & 0x000000FFL); for (int j = 0; j < 8; j++) { if ((wCRCin & 0x00000001L) != 0) { wCRCin >>= 1; wCRCin ^= wCPoly; } else { wCRCin >>= 1; } } } return wCRCin ^= 0xFFFFFFFFL; } /** * CRC-32/MPEG-2 * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x04C11DB70xFFFFFFFF0x00000000MSB First
* * @param source * @param offset * @param length * @return */
public static long CRC32_MPEG_2(byte[] source, int offset, int length) { long wCRCin = 0xFFFFFFFFL; long wCPoly = 0x04C11DB7L; 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 c31 = ((wCRCin >> 31 & 1) == 1); wCRCin <<= 1; if (c31 ^ bit) { wCRCin ^= wCPoly; } } } wCRCin &= 0xFFFFFFFFL; return wCRCin ^= 0x00000000L; } /** * CRC-32/POSIX * * * * * * * * * * * * * * *
多项式初始值异或值Bit反转
0x04C11DB70x000000000xFFFFFFFFMSB First
* * @param source * @param offset * @param length * @return */
public static long CRC32_POSIX(byte[] source, int offset, int length) { long wCRCin = 0x00000000L; long wCPoly = 0x04C11DB7L; 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 c31 = ((wCRCin >> 31 & 1) == 1); wCRCin <<= 1; if (c31 ^ bit) { wCRCin ^= wCPoly; } } } wCRCin &= 0xFFFFFFFFL; return wCRCin ^= 0xFFFFFFFFL; } }

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