基础是多项式除法,把发送的数据当作一个二进制流,用这个二进制流除以一个生成多项式(叫做GF(2)),把余数接在原来的二进制后面发送出去
基本过程:
发送方:
发送方和接收方采用同一个生成多项式g(x),其中g(x)的首位和末位必须都是1。发送方数据t(x).
1.发送方m位数据转化成二进制后面添加r位0,扩展到m+r位,追加后的多项式叫T(x)
2.用T(x)除以g(x)后的r位余数y(x),这里除法采用的异或操作,这个余数就是CRC校验码
3.把r位余数y(x)追加到t(x)后面得到s(x),s(x)=t(x)y(x)就是要发送的数据,如果接受方收到这个数据并且没有被篡改过那么这个数除以g(x)一定为0
接收方:
1.用接收到的s(x)除以g(x)
2.如果g(x)为0,则表示数据正确
常用的多项式:
标准 | 生成多项式 | 16 进制表示 |
CRC12 | x^12 + x^11 + x^3 + x^2 + x + 1 | 0x80F |
CRC16 | x^16 + x^15 + x^2 + 1 | 0x8005 |
CRC16-CCITT | x^16 + x^12 + x^5 + 1 | 0x1021 |
CRC32 | x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11+ x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 | 0x04C11DB7 |
java中CRC32的使用:
String msg = "hello world";
Checksum checksum = new CRC32();
byte[] bytes = msg.getBytes();
checksum.update(bytes, 0, bytes.length);
long value = checksum.getValue();
System.out.println(value)