转载请标明出处: http://blog.csdn.net/xx326664162/article/details/51718857 文章出自:薛瑄的博客
你也可以查看我的其他同类文章,也会让你有一定的收货!
大概思路
我先说一下查表法,表的计算方法,以CRC4为例:
生成多项式:B = 10011B
测试数据:A = 0011 1110B
1、查表法实际上是利用XOR的交换律和结合律:(A XOR B)XOR C=A XOR (B XOR C)
2、将测试数据A 每4bit分为一组,0011 0000B 和 1110B
- 先计算出0011 0000B的CRC4值
- 然后XOR下个4bit 1110B,再计算CRC4的值。
分组举例:
C1=00110000B,C2=1110B,C3=0011B.
A = C1 XOR C2
则 A XOR B = (C1 XOR C2) XOR B =(C1 XOR B )XOR C2
可能你会产生几个问题:
1、为什么要每4bit分为一组?
注意: 由于每次处理多bit(假设是N),那么数据长度必须是N的倍数。
- 以半字节为例,由于每次处理4bit,所以数据长度必须为4的倍数。
- 如果非4的倍数,需要特殊处理(驱动表法和直接计算法混用)。
例如,数据长度是74bit,前面72bit可以按照查表法,后面2bit则只能是直接计算法。
每4bit一组,完全是为了方便计算
2、就算分组,还不一样是要计算,那和直接计算有什么区别?
可以事先计算出,0000B - 1111B所有数据,对应CRC的值,保存在程序中。这样将数据划分后,计算时遇到数据,直接查表得到对应CRC的值,省去了计算的过程。
计算表:
- 生成多项式:B = 10011B
- 测试数据:A = 0011 1110B
1、A对B的CRC 过程可以表示为:A XOR B1 XOR B
——————————————
A 0 0 1 1 1 1 1 0
1 0 0 1 1 0 B1
——————————
1 1 0 0 0
1 0 0 1 1 B
————————
1 0 1 1
2、
将测试数据A每4bit分组C1=00110000B,C2=1110B。A = C1 XOR C2
A XOR B1 XOR B = (C1 XOR C2)XOR B1 XOR B = (C1 XOR B1 XOR B XOR )C2
——————————————
C1 0 0 1 1 0 0 0 0
1 0 0 1 1 0 B1
——————————
1 0 1 1 0
1 0 0 1 1 B
————————
0 1 0 1
C2 1 1 1 0
——————
1 0 1 1
这样就可以把数据CRC的计算,分为每4bit一组来计算CRC的值,因为4bit可表示16中情况,所以可以分别列出这些4bit数据对应的CRC值,以后直接拿来用,于是有了下表。
3、多项式crc4的表格
索引 | 数据 | 表值 |
---|---|---|
0 | 0000 | 0000 |
1 | 0001 | 0011 |
2 | 0010 | 0110 |
3 | 0011 | 0101 |
4 | 0100 | 1100 |
5 | 0101 | 1111 |
6 | 0110 | 1010 |
7 | 0111 | 1001 |
8 | 1000 | 1011 |
9 | 1001 | 1000 |
10 | 1010 | 1101 |
11 | 1011 | 1110 |
12 | 1100 | 0111 |
13 | 1101 | 0100 |
14 | 1110 | 0001 |
15 | 1111 | 0010 |
用查表法计算之前的例子:
——————————————
A 0 0 1 1 1 1 1 0
0 1 0 1 表中查找数据0011对应的表值为0101
——————
1 0 1 1
Java实现CRC8校验——查表法
http://blog.csdn.net/trbbadboy/article/details/16859937
http://www.javacui.com/Theory/218.html
/** * CRC8相关计算 * encode: utf-8 * * @author trb * @date 2013-11-21 */ public class CRC8 {
static byte[] crc8_tab = { (byte) 0, (byte) 94, (byte) 188, (byte) 226, (byte) 97, (byte) 63</