作者sniperliao (中技运动会相簿=>)
看板Visual_Basic
标题[VB6 ] 请问各为前被关於 CRC16
时间Sun Dec 25 20:57:28 2005
作业需求
CRC16 Code..
我自己写了一次,但是就是run不出来
Dim a(3) As Byte
a(0) = 97 ' 求'a'字元的FCS,FCS意旨在原始文字後接上16bit的0进行crc运算
a(1) = 0 '8bit 0
a(2) = 0 '8bit 0
Debug.Print crc16b(a)
正确的crc余值为 8145.. 但是我怎麽run都是错,已经不知道该怎麽改了
烦请有相关设计经验的人指点!
Function crc16b(data() As Byte) As String
Dim crch, crcl As Byte 'crch,crcl为crc16高低位
Dim becrch, becrcl As Byte '存放余值
Dim tmp As Byte '强迫数值为Byte用
Dim nowp '目前计算位置
becrch = &HFF '初始皆是 11111111
becrcl = &HFF '同上
crcl = &H5 'CRC16 的计算式 X^16+X^15+X^2+X^1 = 11000000000000101 = H018005
crch = &H80 '同上,X^16不记入 所以是高位H80 低为H05
becrch = becrch And data(0)
becrcl = becrcl And data(1)
'载入欲计算阵列(0) (1)於高低位
nowp = 16 '因载入两阵列16bits
'所以nowp跳至16
Do Until nowp = UBound(data) * 8 '运算直到nowp=阵列最後bit
If (becrch And &H80) = &H0 Then '若余值高位元的最高位为0
becrch = byteLeft(becrch, 1) '余值高位元左移1bits
If (becrcl And &H80) = &H1 Then '若余值低位元的最高位为1
becrch = becrch Or 1 '高位元最後值填入1
End If
becrcl = byteLeft(becrcl, 1) '余值低位元左移1
tmp = 2 ^ (8 - nowp Mod 8) '取出下一值所需的二进制
If data(Int(nowp / 8 + 1)) And tmp Then '若下一值(需补上的)为1
becrcl = becrcl Or 1 '余值低位元最後值填入1
End If
nowp = nowp + 1 '运算位置累加1
Else
becrch = becrch Xor crch '若最高位不是0
becrcl = becrcl Xor crcl '高低位皆对进行对应crc进行XOR
End If
Loop
crc16b = Hex(becrch) & Hex(becrcl) '印出余值16进位
End Function
--
★ NTIT 05' 运动会 (详见下列Album)
Album =
http://www.wretch.cc/album/rmrug =
Guest Book =
http://gb1.demons.to/afgb.php?A=sniperliao =
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.221.15.86