实现的CRC-32算法,Java编写,使用二进制异或相除法实现。
public static int CRC322(final byte[] _bytes) {
// 补充32位0
byte[] 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