Вычисление контрольной суммы для шестнадцатеричных слов в VBA - PullRequest
0 голосов
/ 02 мая 2019

В настоящее время я просматриваю электронную таблицу со списком из N шестнадцатеричных слов и контрольной суммой для их проверки.

Контрольная сумма - это просто дополнение двух к сумме, то есть сумма всех слов, перевернутая, + 0b1.

Я не уверен, что это самый простой способ рассчитать это в VBA, поскольку на этом уровне это не особенно удобно.

Может кто-нибудь предложить решение?

Ответы [ 2 ]

3 голосов
/ 02 мая 2019

В качестве альтернативы, используйте функцию hex2dec (), чтобы преобразовать свой гекс в десятичную, умножьте на -1, чтобы сделать его отрицательным, а затем используйте dec2bin, чтобы преобразовать его в двоичный код (который автоматически показывает как комплимент 2, так как он отрицательный. Так что, если ваш гекс находится в ячейке D4, тогда формула

=DEC2BIN(HEX2DEC(D4)*-1)

это то, что вам нужно

1 голос
/ 02 мая 2019

В одну сторону

Private Declare PtrSafe Function HashData Lib "shlwapi" (pbData As Any, ByVal cbData As Long, pbHash As Any, ByVal cbHash As Long) As Long

Private Function HashString(Text As String) As Long
     HashData ByVal Text, Len(Text), HashString, Len(HashString)
End Function

Второй

Function test(MyData As String)
    CheckSum = 0
    For a = 1 To Len(MyData)
       CheckSum = CheckSum + Asc(Mid(MyData, a, 1))
    Next
    test = Right(("0000" & Hex(CheckSum)), 4)
End Function

Третий

Option Explicit
Option Compare Text

Private Crc32Table(255) As Long

Public Function InitCrc32(Optional ByVal Seed As Long = _
   &HEDB88320, Optional ByVal Precondition As _
   Long = &HFFFFFFFF) As Long
Dim iBytes As Integer, iBits As Integer, lCrc32 As Long
Dim lTempCrc32 As Long
   On Error Resume Next
   For iBytes = 0 To 255
      '// Initiate lCrc32 to counter variable
      lCrc32 = iBytes
      '// Now iterate through each bit in counter byte
      For iBits = 0 To 7
         '// Right shift unsigned long 1 bit
         lTempCrc32 = lCrc32 And &HFFFFFFFE
         lTempCrc32 = lTempCrc32 \ &H2
         lTempCrc32 = lTempCrc32 And &H7FFFFFFF
         'mix Crc32 checksum with Seed value
         If (lCrc32 And &H1) <> 0 Then
            lCrc32 = lTempCrc32 Xor Seed
         Else
            lCrc32 = lTempCrc32
         End If
      Next
      Crc32Table(iBytes) = lCrc32
   Next
   InitCrc32 = Precondition
End Function

Public Function AddCrc32(ByVal Item As String, _
  ByVal Crc32 As Long) As Long
   Dim bCharValue As Byte, iCounter As Integer, lIndex As Long
   Dim lAccValue As Long, lTableValue As Long
   On Error Resume Next
   '// Iterate through the string that is to be checksum-computed
   For iCounter = 1 To Len(Item)
      '// Get ASCII value for the current character
      bCharValue = Asc(Mid$(Item, iCounter, 1))
      '// Right shift an Unsigned Long 8 bits
      lAccValue = Crc32 And &HFFFFFF00
      lAccValue = lAccValue \ &H100
      lAccValue = lAccValue And &HFFFFFF

      '// Now select the right adding value from the
       'holding table
      lIndex = Crc32 And &HFF
      lIndex = lIndex Xor bCharValue
      lTableValue = Crc32Table(lIndex)
      Crc32 = lAccValue Xor lTableValue
   Next
   '// Set function value the the new Crc32 checksum
   AddCrc32 = Crc32
End Function

Public Function GetCrc32(ByVal Crc32 As Long) As Long
   On Error Resume Next
   GetCrc32 = Crc32 Xor &HFFFFFFFF
End Function


Public Sub Main()
    Dim lCrc32Value As Long
    On Error Resume Next
    lCrc32Value = InitCrc32()
    lCrc32Value = AddCrc32("This is the original message!", _
       lCrc32Value)
    Debug.Print Hex$(GetCrc32(lCrc32Value))

End Sub

Гораздо больше способов

...