求助:EXCEL,VB,實現 CRC16 校驗

Hz0615發表於2020-12-01

1、想要在EXCEL內將:“6E 04 40 0B 00 22 ”這個6個16進位制資料,做一個CRC16校驗
這個黃色單元格內是需要處理的資料,
紫色單元格內是在http://www.ip33.com/crc.html計算得到的結果。但是每次去網站上面算麻煩。

2、我現在不知道要把一個什麼值給到“CRC16”這個公式
我在一個單元輸入公式“=CRC16(A1)”後,提示結果是:#REF!
不知道這句是什麼意思:Public Function CRC16(Data() As Byte, ByRef bLow As Byte, ByRef bHigh As Byte) As String
試了一下午了累死了。

3、網上找到的程式碼如下,出處是這裡:https://www.cnblogs.com/zitjubiz/p/modbus_crc16.html
這裡面得到一個"CRC16公式"

Public Function CRC16(Data() As Byte, ByRef bLow As Byte, ByRef bHigh As Byte) As String

Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC暫存器
Dim CL As Byte, ch As Byte '多項式碼&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim flag As Integer
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = 1
ch = &HA0

For i = LBound(Data) To UBound(Data) - 2
CRC16Lo = CRC16Lo Xor Data(i) '每一個資料與CRC暫存器的低8位進行異或
'右移8次
For flag = 0 To 7
'記錄一下,用來判斷移出位是0還是1
SaveHi = CRC16Hi
SaveLo = CRC16Lo

CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位

If ((SaveHi And &H1) = &H1) Then '如果高位位元組最後一位為1
CRC16Lo = CRC16Lo Or &H80 '則低位位元組右移後前面補1
End If '否則自動補0

If ((SaveLo And &H1) = &H1) Then '如果移出位為1,則與多項式碼進行異或
CRC16Hi = CRC16Hi Xor ch
CRC16Lo = CRC16Lo Xor CL
End If
Next flag
Next i
Dim ReturnData(1) As Byte
ReturnData(0) = CRC16Hi 'CRC高位
ReturnData(1) = CRC16Lo 'CRC低位
Dim Value As Double
Value = CLng(CRC16Hi * 256) + CRC16Lo
CRC16 = ReturnData
bHigh = CRC16Hi
bLow = CRC16Lo

End Function

相關文章