实现的CRC-32算法,Java编写,使用二进制异或相除法实现。
public static int CRC322(final byte[] _bytes) {// 补充32位0byte[] bytes = new byte[_bytes.length + 4];System.arraycopy(_bytes, 0, bytes, 0, _bytes.length);// CRC初始值Bits crc = Bits.valueOf(0xFFFFFFFFL);// 生成多项式Bits expr = Bits.valueOf(0x104C11DB7L);// 位流读取BitsInputStream bis = new BitsInputStream(bytes, BitReaderOrder.LeftToRight, BitOrder.RightIsHigh);for (int i=0; i<_bytes.length; i++ ) {Bits b = new Bits(8); // 读取一个字节b.setValue(bis.ReadBits(8));b = b.extendLowOrder(32); // 补充32位b = b.xor(8, crc); for (int j=0; j<8; j++) { // 40 - 32 循环8次if (b.getHighest() == true) { b = b.xor(b.getLength()-expr.getLength(), expr); // 从高向低异或}b = b.getRange(0, 40 - j - 1); // 抛弃最高位,必然是0}crc = b; // 写回crc寄存器}crc = crc.xor(Bits.valueOf(0xFFFFFFFFL)); crc = crc.reverse(); // 反转return crc.toInt();}
测试:
System.out.println("CRC=" + Integer.toHexString(CRC322("abcabcabcabcabcabcabcabcabcabcabcabc1111".getBytes())));
CRC=a93145a2