CRC32 循环冗余校验

实现的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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值