循环冗余码!!求助
看了好久的循环冗余码,还是搞不懂,希望高手指点迷津啊以下是一段循环冗余码的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.我理解的循环冗余码计算过程应该是针对整个字符串进行计算的,可是为何这段代码的计算过程完全不一样呢,而是一个字符一个字符处理。
--------------------编程问答-------------------- CRC类似除法取余的过程。
可以Google下相关代码。 --------------------编程问答-------------------- 帮项咯 --------------------编程问答--------------------
CRC的除法取余跟传统的除法取余是不是有些不同
CRC的除法取余是用异或来代替减法是吗 --------------------编程问答-------------------- 这个算法好象是CRC16的算法,多项式是A001
校验的时候是移动每个位来计算的,因为没有移位操作,所以在VB下面就写起来麻烦了.
不太清楚这个ccitt是什么
--------------------编程问答-------------------- 1)对 CRC16 而言,只有低 16 位是有效的,更高位总是要被丢弃的。
2)当然是逐个字节进行计算的。 --------------------编程问答--------------------
我理解的是计算过程是这样的:
这段程序好像跟这个计算过程完全不同啊 --------------------编程问答-------------------- 你的二进制减法错误,比如第一轮的末尾:
10000-00001=10001
http://wugf.blog.sohu.com/109606803.html
补充:VB , 基础类