[VB6 ] 分享 CRC-16 Function (自寫)

看板Visual_Basic作者時間19年前 (2005/12/27 23:50), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
分享一下,這是自己的寫法 :) 呼叫方式 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)
文章代碼(AID): #13iMBLPj (Visual_Basic)
文章代碼(AID): #13iMBLPj (Visual_Basic)