论文网
English Papers
万事OK网
发表论文
 
 首页 > IT文章 > 程序设计 >
CRC算法原理及C语言实现

[科技论文网] http://www.scipapers.com    2007-12-01  


    注意,顶部结果总是0,这就是组合XOR操作导致的结果.(翻译不准确,保留原文)

      现在我们回到figure 1,对每一个顶部字节的值都做移出操作,我们可以预先计算出一个值.
    此例中,它将是一个包含256个double word(32 bit)双字的表.(附录中CRC-32的表).
    (翻译不准确,保留原文) 

    用伪语言表示我们的算法如下:

    While (byte string is not exhausted)
        Begin
        Top = top_byte of register ;
        Register = Register shifted 8 bits left ORred with a new byte from string ;
        Register = Register XORred by value from precomputedTable at position Top ;
        End

    direct table算法:
      上面提到的算法可以被优化.字节串中的字节在被用到之前没有必要经过整个记村器.用
    这个新的算法,我们可以直接用一个字节去XOR一个字节串通过将此字节移出记存器.结果
    指向预先计算的表中的一个值,这个值是用来被记存器的值做XOR运算的. 
      我不十分确切的知道为什么这会得到同样的结果(这需要了解XOR运算的特性),但是这又
    极为便利,因为你无须在你的字节串后填充0字节/位.(如果你知道原理,请告诉我:)
      让我们来实现这个算法:

      +----< byte string  (or file)  字节串,(或是文件)
      |
      v       3   2   1   0    byte  字节
      |     +---+---+---+---+
    XOR---<|   |   |   |   |  Register  记存器
      |     +---+---+---+---+
      |             |
      |            XOR
      |             ^
      v     +---+---|---+---+
      |     |   |   |   |   |  Precomputed table 值表(用来进行操作)
      |     +---+---+---+---+
      +--->-:   :   :   :   :
            +---+---+---+---+
            |   |   |   |   |
            +---+---+---+---+
    (figure 2)

    'reflected' direct Table 算法:

      由于这里有这样一个与之相对应的'反射'算法,事情显得复杂了.一个反射的值/记存器
    就是将它的每一位以此串的中心位为标准对调形成的.例如:0111011001就是1001101110
    的反射串. 
      他们提出'反射'是因为UART(一种操作IO的芯片)发送每一个字节时是先发最没用的0位,
    最后再发最有意义的第七位.这与正常的位置是相逆的. 
      除了信息串不做反射以外,在进行下一步操作前,要将其于的数据都做反射处理.所以在
    计算值表时,位向右移,且poly也是作过反射处理的.当然,在计算CRC时,记存器也要向右
    移,而且值表也必须是反射过的. 

      byte string (or file) -->---+
                                  |    1. 表中每一个入口都是反射的.
        byte  3   2   1   0       V    2. 初始化记存器也是反射的.
            +---+---+---+---+     |    3. 但是byte string中的数据不是反射的,
            |   |   |   |   |>---XOR      因为其他的都做过反射处理了.
            +---+---+---+---+     |
                    |             |
                   XOR            V
                    ^             |
            +---+---|---+---+     |
            |   |   |   |   |     |     值表
            +---+---+---+---+     |
            :   :   :   :   : <---+
            +---+---+---+---+
            |   |   |   |   |
            +---+---+---+---+
    (figure 3)

    我们的算法如下:
    1. 将记存器向右移动一个字节.
    2. 将刚移出的哪个字节与byte string中的新字节做XOR运算,
       得出一个指向值表table[0..255]的索引
    3. 将索引所指的表值与记存器做XOR运算.
    4. 如数据没有全部处理完,则跳到步骤1.


    下面是这个算法的简单的可执行汇编源码:

    完整的CRC-32标准所包含的内容:
    Name            : "CRC-32"
    Width           : 32
    Poly            : 04C11DB7
    Initial value   : FFFFFFFF
    Reflected       : True
    XOR out with    : FFFFFFFF

    作为对你好奇心的奖励, 这里是CRC-16标准: :)
    Name            : "CRC-16"
    Width           : 16
    Poly            : 8005
    Initial value   : 0000
    Reflected       : True
    XOR out with    : 0000

    'XOR out with' 是为了最终得到CRC而用来与记存器最后结果做XOR运算的值.
    假如你想了解一些关于'reversed'逆向CRC poly的话,请看我的参考文章.
     
      我是在16位DOS模式下用的32位编码,因此你会在这个程序中看到很多32位与16位混合
    的编码...当然这是很容易转换成纯32位编码的.注意这个程序是经过完整测试并且能够
    正常运行的.下面的Java 和 C 代码都是由这个汇编代码而来的. 
    底下的这段程序就是用来计算CRC-32 table的:

            xor     ebx, ebx   ;ebx=0, 将被用做一个指针.
    InitTableLoop:
            xor     eax, eax   ;eax=0 为计算新的entry.
            mov     al, bl     ;al<-bl

            ;生成入口.
            xor     cx, cx
    entryLoop:
            test    eax, 1
            jz     no_topbit
            shr     eax, 1
            xor     eax, poly
            jmp    entrygoon
    no_topbit:
            shr     eax, 1
    entrygoon:
            inc     cx
            test    cx, 8
            jz     entryLoop    来源:

声明:本文由网友推荐或作者提交,版权归原作者所有,刊登此文仅为传播知识,展示研究成果,提高文章引用率。未经原作者授权,禁止用于任何形式的商业行为。科技论文网倡导尊重知识、尊重劳动、保护原创、知识共享。由于部分论文文章来于网络,文章作者不祥,请相关的原创作者与我们联系,以便加上您的署名。

上一页 1 2 3 4 5 6 7 8 9 下一页  
CRC算法原理及C语言实现
下面没有链接了     欧几里德算法及其实现
最新论文
·[程序设计]CRC算法原理及C语言实现
·[程序设计]欧几里德算法及其实现
·[程序设计]蚁群算法Python实现
·[程序设计]图像二值化算法源码
·[程序设计]经典面试问题:12小球问题算法2
·[程序设计]经典面试问题:12小球问题算法
·[程序设计]图像几何变换插值算法
·[程序设计]C算法—堆排序
·[程序设计]人机博弈程序实现
·[程序设计]A*算法Python实现
 
 

搜索论文

Google
论文分类

论文网 论文发表网 论文 免费论文网 找论文网 毕业论文 中国论文网 英语论文 百度论文 聘教网 易搜
 免费发布论文    中国论文网 2008版权所有  业务联系:pinjiao@126.com