crc循环校验原理和实现
1.CRC简介
CRC(cyclical redundancy check) 循环冗余校验,在《计算机组成原理》里面有这个知识点。类似的校验有奇偶校验。
?
可以简单的理解成在发送数据后面加上这个验证码,判断前面数据是否正确。
?
根据需要的校验位数不同,有 CRC8、CRC16、CRC32、CRC128 ...再以后就不用这个乐,可以使用md5校验。
?
2.简介CRC校验步骤CRC的校验方法网上很多。就说了,用发送的数据来除以校验公式,使其最后的余数为0。
?
3.举例字母a的CRC16校验(CRC-CCITT)采用的校验公式为 G(X) = X16 + X12 + X5 + 1
CRC16校验产生的校验码为16位,就是2个字节。a对应的ascii为0x61,
?这个就是得到的结果。
按第三届手算的过程,非常好理解。
下面是实现
package java.util.zip;public class CRC32 implements Checksum {private int crc = 0; //这个表格的结果就是上面的。private static int[] crc_table = make_crc_table();private static int[] make_crc_table() {int[] crc_table = new int[256];for (int n = 0; n < 256; n++) {int c = n;for (int k = 8; --k >= 0;) {if ((c & 1) != 0)c = 0xedb88320 ^ (c >>> 1);elsec = c >>> 1;}crc_table[n] = c;}return crc_table;}public long getValue() {return (long) crc & 0xffffffffL;}public void reset() {crc = 0;} //这里处理的很不错,可以每次都及时返回结果。public void update(int bval) {int c = ~crc;c = crc_table[(c ^ bval) & 0xff] ^ (c >>> 8);crc = ~c;}public void update(byte[] buf, int off, int len) {int c = ~crc;while (--len >= 0)c = crc_table[(c ^ buf[off++]) & 0xff] ^ (c >>> 8);crc = ~c;}}?9.结束一个CRC,带出得问题好多。CRC就到这里吧。睡觉了。
?
?
?
?
1 楼 paladin1988 2012-04-27 好贴,不错,收藏,感谢。