2014-10-30 6 views
3

Так что, к сожалению, я должен признать, что я сдал 8-часовой поиск правильного кода CRC8 на языке программирования VBA. Есть много примеров, но пока я не нашел тот, который работает в моем случае. Итак, вот я, прошу вас о помощи, если кто-то может написать мне эту часть кода или если есть мистическая ссылка, на которую я не нажал.Расчет CRC8 в VBA

Объяснение:

AppID = "A00000039656434103F0154020D4000A" 

В моем проекте, требуется, чтобы символ «А» в конце этого AppID, так как на основе этого CRC8 должен быть рассчитан. Если вы правильно поняли (потому что я, возможно, сошел с ума в течение всего дня, пытаясь написать эту функцию CRC8), у меня есть 32-byte ID, на котором я хочу сделать проверку CRC8 на 16bits (имеет ли это смысл?)

В приведенный пример, у меня есть только результат того, что CRC8 должен вернуться:

CRC8 = 0x6D 

И мне нужно заменить нижний Nible с полукокса «А» в моей основной AppID:

FinalAppID = "A00000039656434103F0154020D4000D" 

ПРОБЛЕМА: Но я просто не знаю, как писать и конвертировать коды из C++/C#. И я действительно был настроен поэтапно, но это не сработало.

Это код, я использую:

Public function calculateCRC8(ByVal AppID As String) As String 
    Dim CRC8 As Byte 
    Dim i as Integer 
    Dim j as Integer 
    Dim AppIDarray() 


    CRC8 = &HC7; //Based on preset 0xE3  
    aidLenght = LEN(AppID) 
    AppIDarray = StringToArray(AppID) ' I user a UDF that I wrote, this should work OK' 
      For j = 0 To aidLenght 
                CRC8 = CRC8 Xor AppIDarray(j)  
            For i = 1 To 8 
        If CRC8 And &H80 Then 
        CRC8 = (CRC8 * 2) Xor &H1D 
        Else 
        CRC8 = CRC8 * 2 
        End If 
       next i 
      Next j 
    calculateCRC8 = CRC8 
End Function 

Я не в офисе сейчас, так что, возможно, с опечатками в приведенном выше коде, или каких-то глупых ошибок, я написал это только сейчас, моя голова, когда я работал с ним целый день.

Проблемы, которая возникает с выше кодом:

Ошибка:

Error: Overflow! 

Этой ошибка возникает, даже если я прохожу entire string, или просто 16bits. Такая же ошибка.

Если у кого-нибудь есть что-нибудь, чтобы помочь мне здесь, я буду ему очень благодарен!

+0

Знаете ли вы, какая линия вызывает переполнение? Вы уверены, что ваш UDF работает нормально? – James

+0

К сожалению, еще не @James Я не такой хороший VBA, только недавно начал писать код, только из-за этого «маленького» проекта, как мне сказали. Я еще не очень хорош в отладке. Но, когда я MsgBox-ed CRC8 .. У меня появилось странное число .. как большие отрицательные числа. Я снова проверю функцию StringToArray.но я думаю, что все работает нормально, я проверил некоторые тесты. Я также пытался отключить сообщение об ошибке, но я не могу найти способ сделать это? У меня нет этого Solution Explorer, который упоминается в каждой ссылке в Интернете, когда я ищу, как отключить его. –

+0

Это интересный вопрос, но вам действительно нужно заменить его на *** *** *** код и сообщить нам, где происходит ошибка. – RubberDuck

ответ

4

Вот версия с несколькими исправлениями и предотвращает переполнение. Он генерирует ожидаемый результат (& H6D) для ваших шестибайтовых байтов (A00000039656434103F0154020D4000A).

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! Большое спасибо! –

+1

@AndroidNFC при изменении кода я использовал [этот онлайн-калькулятор crc, чтобы проверить его] (http://www.zorc.breitbandkatze.de/crc.html). Для вашей реализации код crc равен 8, crc poly - 1D, начальное значение - C7, а значение Final XOR - 0. К сожалению, сайт не позволяет вводить данные в виде шестнадцатеричных байтов, поэтому вы можете делать только обычные строки , но он по-прежнему обеспечивает хорошее сравнение для проверки реализации. – Blackhawk

Смежные вопросы