2015-10-17 3 views
0

Я раскалываю голову с вычислением CRC8, используя Excel VBA. Я написал функцию в VBA, которая возвращает значение CRC8, которое впоследствии может быть сохранено в ячейке. Тем не менее, при печати же я получаю сообщение об ошибке «OverFlow».Расчет CRC8 для Excel VBA

Пожалуйста, предложите ... Вот фрагмент кода.

Я получаю переполнение в функции в "ShiftLeft = Num * (2^мест)"

Function CRCPrateek(CRCrng As Range) As Integer 

    Dim CRC As Integer 
    Dim length As Integer 
    Dim Hexbyte As Integer 
    Dim i As Integer 

    'Initial CRC seed is Zero CRC = H00 
    'The real part of the CRC. Where I commented "Polynomial", it used to be a # define 
    'Polynomial 7. 'I replaced the word Polynomial with 7, however that means the 7 may 
    'be subject to change depending on the version of the crc you are running. 
    'To loop it for each cell in the range 

    For Each cel In CRCrng 
     'Verify if there is atleast one cell to work on 
     If Len(cel) > 0 Then 
      Hexbyte = cel.Value 
      CRC = CRC Xor Hexbyte 
      For i = 0 To 7 
       If Not CRC And H80 Then 
        CRC = ShiftLeft(CRC, 1) 
        CRC = CRC Xor 7 
       Else 
        CRC = ShiftLeft(CRC, 1) 
       End If 
      Next 
     End If 
    Next 
    CRCPrateek = CRC 
End Function 

Function ShiftLeft(Num As Integer, Places As Integer) As Integer 

    ShiftLeft = Num * (2^Places) 

End Function 
+0

Изменить все ваши ** ** Целые заявления к ** Long **. –

+0

, но я получаю 1 байт CRC? По моему пониманию я должен получить 1 байт для CRC8 _ATM. –

+0

Я изменил все объявления на байты и долго, но все же я получаю ошибку переполнения. –

ответ

0

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

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' GENERATE CRC '' '' '' '' '' '' ' «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» '' '' '' '' '' '' '' '' ''»

Функция CRCPrateek (ByVal crcrng Как Range) As Long

Dim CRC As Byte

длина Dim As Byte

Dim Hexbyte As String

Dim DecByte As Byte

Dim я As Byte

'Initial CRC семян Нулевой

CR = & H0

' Реальная часть КПР. Где я прокомментировал «Полиномиальный», он был # define «Полиномиальный 7. Я заменил слово Polynomial на 7, однако это означает, что 7 может 'могут быть изменены в зависимости от версии выполняемого вами crc.

'Для того, чтобы петли его для каждой ячейки в диапазоне для каждого CEL В crcrng

'Verify if there is atleast one cell to work on 

' If Len (CEL)> 0 Тогда

DecByte = cel.Value 

    crc = crc Xor DecByte 

    For i = 0 To 7 

     If ((crc And &H80) <> 0) Then 

      crc = ShiftLeft(crc, 1) 

      crc = crc Xor 7 


     Else 

      crc = ShiftLeft(crc, 1) 

     End If 

    Next 

'End If

Следующий

CRCPrateek = crc

End Function

Функция ShiftLeft (ByVal Num As Byte, ByVal места, как Byte) As Byte

ShiftLeft = ((Num * (2^мест)) А & HFF) End Function

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' END OF CRC '' '' '' '' '' '' '' '' ' ' '' '' '' '' '' '' '' '' «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» '' '' '' '' '

T он единственное, что вам нужно передать здесь как параметр при вызове указанной функции, - это диапазон ячеек (который имеет десятичные значения (используйте значения HEX2DEC в ячейках).

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' ПРИМЕР ПРИЗЫВ К ФУНКЦИИ CRC ОТ А SUB ' '' '' ' «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» «» '' '' '' '' '' '' '' '' '' '' '' '

' выберите Crc Range Set crcrng = Range ("i88", "U88")

= CRC CRCPrateek (crcrng)

Sheet1.Cells (88, 22) .Value = CRC

МздВох ("значение CRC является" & Sheet1.Cells (86, 22) .value & "(в HEX)")

Примечание: Эта функция принимает входные значения в качестве знаков после запятой, вычисляет значение CRC в десятичной & позже после возврата значения CRC вы можете сохранить его в любых других ячейках. & конвертировать обратно в гексагон с помощью формулы DEC2HEX в ячейках

Надеюсь, это поможет. :)

С уважением,

Prateek

0

Используйте left shift "<<" operation, не умножение. Он не может переполняться.

+0

Я полагаю, что мы не можем напрямую использовать операции сдвига влево в VBA. Если можно, как? Пожалуйста, помогите мне. –

+0

Да, вы можете. Синий цвет в тексте означает, что это «гиперссылка» и может быть «нажата», что в этом случае приведет вас к странице Microsoft Visual Basic в операторе сдвига влево. –

0

Вы работаете над 2-байтовыми целыми числами, а не байтами. Кроме того, я сомневаюсь, что cell.value действительно является шестнадцатеричным значением, а скорее шестнадцатеричной строкой типа «3F», которую сначала нужно преобразовать в числовое значение (в диапазоне 0..255).
Для создания истинного массива байтов и байта CRC придают этому решению: Calculating CRC8 in VBA

Там вы найдете решение перелива, а именно маскировка старший бит перед переключением.

+0

Эй, значение Cell.value является шестнадцатеричным значением. Я тоже работаю над одним байтом.Кстати, не могли бы вы указать и объяснить, как я работаю над 2 байтовым целым. Я конвертирую, но конвертирую hex в десятичный знак перед выполнением вычислений. –

+0

'Dim Hexbyte As Integer' и' Hexbyte = cel.Value'. «Целое число» - 16 бит = 2 байта, «Байт» - 8 бит = 1 байт. Для содержимого ячейки я только размышляю - это строка или число? Как ввести шестнадцатеричные значения ниже 0x20 в ячейку? OTOH, код, который я привел, уже работает. – user1016274