[VB6 ] 分享 CRC-16 Function (自寫)
分享一下,這是自己的寫法 :)
呼叫方式
fcs=crc16b(欲計算之byte陣列)
例如 'a' 的 ASCII 為 97 = &H61
則
Dim a(3) as byte
a(0)=0
a(1)=97 '或是 a(1)=asc("a")
a(2)=0
a(3)=0
debug.print crc16b(a)
結果為 8145 (此為CRC16之FCS)
若 crc16b( [原本資料+FCS+16bit的零]byte陣列 ) = 0
代表資料無誤
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 tmp1 As Integer
Dim nowp '目前計算位置
becrch = &HFF '初始皆是 11111111
becrcl = &HFF '同上
crcl = &H5 'CRC16 的計算式 X^16+X^15+X^2+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) + 1) * 8 '運算直到nowp=陣列最後bit
If (becrch And &H80) = &H0 Then '若餘值高位元的最高位為0
becrch = SHL(becrch, 1) '餘值高位元左移1bits
If (becrcl And &H80) = &H80 Then '若餘值低位元的最高位為1
becrch = becrch Or 1 '高位元最後值填入1
End If
becrcl = SHL(becrcl, 1) '餘值低位元左移
tmp = 2 ^ (7 - (nowp) Mod 8) '取出下一值所需的二進制
If data(Int(nowp \ 8)) And tmp Then '若下一值(需補上的)為1
becrcl = becrcl Or 1 '餘值低位元最後值填入1
End If
nowp = nowp + 1 '運算位置累加1
Else
becrch = SHL(becrch, 1) '餘值高位元左移1bits
If (becrcl And &H80) = &H80 Then '若餘值低位元的最高位為1
becrch = becrch Or 1 '高位元最後值填入1
End If
becrcl = SHL(becrcl, 1) '餘值低位元左移
tmp = 2 ^ (7 - (nowp) Mod 8)
If data(Int(nowp \ 8)) And tmp Then '若下一值(需補上的)為1
becrcl = becrcl Or 1 '餘值低位元最後值填入1
End If
nowp = nowp + 1 '運算位置累加1
becrch = becrch Xor crch '若最高位不是0
becrcl = becrcl Xor crcl '高低位皆對進行對應crc進行XOR
End If
Loop
'以下是fcs轉成string回傳
If Len(Hex(becrch)) < 2 Then
crc16b = crc16b & "0" & Hex(becrch)
ElseIf Hex(becrch) = 0 Then
crc16b = crc16b & "00"
Else
crc16b = crc16b & Hex(becrch)
End If
If Len(Hex(becrcl)) < 2 Then
crc16b = crc16b & "0" & Hex(becrcl)
ElseIf Hex(becrcl) = 0 Then
crc16b = crc16b & "00"
Else
crc16b = crc16b & Hex(becrcl)
End If
End Function
補上左移 Function 這是網路上找到的
Public Function SHL(ByVal OPR As Byte, ByVal n As Integer) As Byte
Dim BD As Byte
Dim I As Integer
BD = OPR
For I = 1 To n - 1
BD = (BD And &H7F) * 2
Next I
CF = BD And &H80
SHL = (BD And &H7F) * 2
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
※ 編輯: sniperliao 來自: 61.221.15.86 (12/28 00:00)
Visual_Basic 近期熱門文章
PTT數位生活區 即時熱門文章