看了好久的循环冗余码,还是搞不懂,希望高手指点迷津啊
以下是一段循环冗余码的VB程序(CRC_CCITT):
Function CRC_CCITT(data() As Byte) As String
      Dim CRC16Lo As Byte, CRC16Hi As Byte
      Dim CL As Byte, CH As Byte
      Dim SaveHi As Byte, SaveLo As Byte
      Dim i As Integer
      Dim Flag As Integer
      CRC16Lo = &HFF
      CRC16Hi = &HFF
      CL = &H21
      CH = &H10
      For i = 0 To UBound(data)
        CRC16Hi = CRC16Hi Xor data(i)
        For Flag = 0 To 7
          SaveHi = CRC16Hi
          SaveLo = CRC16Lo
          If CRC16Hi * 2 > &HFF Then
            CRC16Hi = CRC16Hi * 2 - &H100
          Else
            CRC16Hi = CRC16Hi * 2
          End If
          If CRC16Lo * 2 > &HFF Then
            CRC16Lo = CRC16Lo * 2 - &H100
          Else
            CRC16Lo = CRC16Lo * 2
          End If
          If ((SaveLo And &H80) = &H80) Then
            CRC16Hi = CRC16Hi Or &H1
          End If
          If ((SaveHi And &H80) = &H80) Then
            CRC16Hi = CRC16Hi Xor CH
            CRC16Lo = CRC16Lo Xor CL
          End If
        Next Flag
      Next i
      Dim ReturnData(1) As Byte
      ReturnData(0) = CRC16Hi
      ReturnData(1) = CRC16Lo
      CRC_CCITT = ReturnData
    End Function有两点我十分不解:
1.CCITT的生成式应该是11021H,为什么该段代码用的是1021H呢;
2.我理解的循环冗余码计算过程应该是针对整个字符串进行计算的,可是为何这段代码的计算过程完全不一样呢,而是一个字符一个字符处理。

解决方案 »

  1.   

    CRC类似除法取余的过程。
    可以Google下相关代码。
      

  2.   

    CRC的除法取余跟传统的除法取余是不是有些不同
    CRC的除法取余是用异或来代替减法是吗
      

  3.   

    这个算法好象是CRC16的算法,多项式是A001
    校验的时候是移动每个位来计算的,因为没有移位操作,所以在VB下面就写起来麻烦了.
    不太清楚这个ccitt是什么
      

  4.   

    1)对 CRC16 而言,只有低 16 位是有效的,更高位总是要被丢弃的。
    2)当然是逐个字节进行计算的。
      

  5.   

    你的二进制减法错误,比如第一轮的末尾:
    10000-00001=10001http://wugf.blog.sohu.com/109606803.html