2014-10-30 206 views
3

很遺憾,我不得不承認,我放棄了在VBA編程語言中8小時搜索正確的CRC8代碼。 有很多例子,但我還沒有找到適合我的例子。所以在這裏,請求你的幫助,如果有人可以給我寫這段代碼,或者如果有一個神祕的鏈接,我沒有點擊。在VBA中計算CRC8

說明:

AppID = "A00000039656434103F0154020D4000A" 

在我的項目,則要求字符「A」在這的AppID結束,因爲在此基礎上的CRC8應計算。如果理解正確的我有32-byte ID,關於這一點我想要做的16bits的CRC8檢查(因爲我可能在試圖寫這個CRC8功能整天都瘋了)(這是否有道理?)

在給定的例子,我的CRC8應該返回什麼只有結果:

CRC8 = 0x6D 

,我需要更換下部nible與字符「A」在我的主要的AppID:

FinalAppID = "A00000039656434103F0154020D4000D" 

問題:但我根本不知道如何編寫,也無法將C++/C#中的代碼進行轉換。而且我一步一步地完成轉換,但它沒有奏效。

這是我使用的代碼:

​​

我現在不在辦公室,所以有可能在上面的代碼中錯別字,或者一些愚蠢的錯誤,我剛纔寫的我的頭,因爲我一整天都在用它。

與上述代碼發生的問題是:

錯誤:

Error: Overflow! 

即使我通過entire string,或只是16bits發生該錯誤。同樣的錯誤。

如果有人有什麼可以幫助我的話,我會非常感激他!

+0

你知道哪一行會導致溢出嗎?你確定你的UDF工作正常嗎? – James 2014-10-30 22:20:53

+0

不幸的是@James我不是那麼好的VBA,最近剛剛開始編碼,只是因爲他們告訴我的這個「小」項目。我不是很好,但在調試。但是,當我MsgBox的CRC8 ..我有一些奇怪的數字..如大負數。 我會再次檢查StringToArray函數。但我認爲它工作正常,我做了一些測試。 我也嘗試關閉錯誤消息,但我找不到這樣做的選項?當我搜索如何將其關閉時,我沒有在網絡上的每個鏈接中提到的解決方案資源管理器。 – 2014-10-30 22:23:50

+0

這是一個有趣的問題,但您確實需要用*** ***代碼替換它,並讓我們知道發生錯誤的位置。 – RubberDuck 2014-10-31 09:52:25

回答

4

這是一個版本的幾個修復程序,它可以防止發生溢出。它爲您的十六進制字節(A00000039656434103F0154020D4000A)生成預期結果(& H6D)。

Public Function calculateCRC8(ByVal AppID As String) As String 
    Dim CRC8 As Byte 
    Dim i As Integer 
    Dim j As Integer 
    Dim AppIDarray() As Byte '<--- explicitly dimensioned as a Byte array to avoid confusion 


    CRC8 = &HC7 

    'The AppID is actually bytes stored in hexadecimal in a string. You have to convert them back to bytes before you can run a crc8 on them. 
    AppIDarray = HexToByte(AppID) 
    aidLength = UBound(AppIDarray) 
      For j = 0 To aidLength 
       CRC8 = CRC8 Xor AppIDarray(j) 
       For i = 1 To 8 
        If CRC8 And &H80 Then 
        'masking off the left-most bit before shifting prevents the Overflow error. 
        CRC8 = ((&H7F And CRC8) * 2) Xor &H1D 
        Else 
        CRC8 = CRC8 * 2 
        End If 
       Next i 
      Next j 
    calculateCRC8 = CRC8 
End Function 

該函數接受一個十六進制字符串並將其解釋爲Byte數組。

Public Function HexToByte(strHex As String) As Byte() 
    Dim i As Integer 
    Dim tempByte As Byte 
    Dim outBytes() As Byte 
    ReDim outBytes(Len(strHex) \ 2 - 1) 
    For i = 0 To Len(strHex) \ 2 - 1 
     For j = 0 To 1 
      char = Mid(strHex, i * 2 + j + 1, 1) 
      Select Case char 
       Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9": 
        tempByte = tempByte Or (Asc(char) - 48) 
       Case "A", "B", "C", "D", "E", "F": 
        tempByte = tempByte Or (Asc(char) - 55) 
      End Select 
      If j = 0 Then 
       tempByte = tempByte * 2^4 
      Else 
       outBytes(i) = tempByte 
       tempByte = 0 
      End If 
     Next 
    Next 
    HexToByte = outBytes 
End Function 
+0

太棒了!恭喜BlackHawk,在第一次測試中,它完全按照它應該的方式運行,並且我得到了CRC8的確切值,就像我在示例Task中的那樣!非常感謝你! – 2014-10-31 15:15:29

+1

@AndroidNFC修改代碼時,我用[這個在線crc計算器來驗證它](http://www.zorc.breitbandkatze.de/crc.html)。對於您的實現,crc順序爲8,crc poly爲1D,初始值爲C7,最終異或值爲0.遺憾的是,該站點不允許以十六進制字節輸入數據,因此您只能執行常規字符串,但它仍然提供了一個很好的比較來測試針對的實現。 – Blackhawk 2014-10-31 15:36:10