CRC查表法——表的由来及Java实现CRC8校验算法

本文详细介绍了CRC查表法的原理,通过CRC4举例说明了数据分组计算CRC值的方法,并给出了Java实现CRC8校验的查表法。强调了查表法的优势在于预先计算并存储所有可能的数据对应CRC值,以提高计算效率。
摘要由CSDN通过智能技术生成
                       

转载请标明出处: 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</
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值