读书人

crc循环校验原理跟实现

发布时间: 2012-11-03 10:57:44 作者: rapoo

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,
crc循环校验原理跟实现
?这个就是得到的结果。

4.C语言实现

按第三届手算的过程,非常好理解。

下面是实现

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 好贴,不错,收藏,感谢。

读书人网 >编程

热点推荐