2016-01-07 3 views
0
  1. Мне нужна помощь в создании контрольной суммы для пакета tcp из массива байта.
  2. Это код работает, поскольку я тестировал его с помощью строки .
  3. Проблема в том, что я должен передать массив байтов этой функции .
  4. На данный момент я создал его просто, используя жесткий встроенный серийный номер времени, в противном случае это очень длинный код для входа в систему .
  5. Значение этого b1: 68: де: 3a: 15: CD: 5б: 07 проверяется с помощью Wireshark и CRC должны быть E2B6 проверены с онлайн стс this
  6. Теперь, приходя в основной момент я просто не могу» t вызовите этот метод, поскольку этот метод ожидает некоторые строковые значения, и я должен передать шестнадцатеричные значения. Как я могу это сделать.crc16 ccitt из массива байтов

    Private Sub ConnectTCP_Click(sender As Object, e As EventArgs) Handles ConnectTCP.Click 
    Dim Serial As UInt32 = "123456789" 
    Dim time As UInt32 = "987654321" 
    Dim buffer2() As Byte = BitConverter.GetBytes(time) 
    Dim buffer3() As Byte = BitConverter.GetBytes(Serial) 
    Dim array4(buffer2.Length + buffer3.Length - 1) As Byte 
    Array.Copy(buffer2, array4, buffer2.Length) 
    Array.Copy(buffer3, 0, array4, buffer2.Length, buffer3.Length) 
    getCRC16(array4) 'What I need to do here 
         end sub 
    

"функции CRC16 МККТТ"»

Public Function getCRC16(ByVal strInput As String) 
    Dim lngCheck As Long 
    Dim Power(7) As Integer 
    Dim I As Integer 
    Dim J As Integer 
    Dim Poly As Long 
    Dim CRC As Long 
    Dim TestBit As Boolean 
    Dim TestBit1 As Boolean 
    Dim TestBit2 As Boolean 
    Poly = &H1021 
    CRC = &HFFFF 
    For J = 0 To 7 
     Power(J) = 2^J 
    Next J 
    For I = 1 To Len(strInput) 
     lngCheck = Asc(Mid$(strInput, I, 1)) 
     For J = 7 To 0 Step -1 
      If (CRC And 32768) = 32768 Then 
       TestBit1 = True 
      Else 
       TestBit1 = False 
      End If 
      If (lngCheck And Power(J)) = Power(J) Then 
       TestBit2 = True 
      Else 
       TestBit2 = False 
      End If 
      TestBit = TestBit1 Xor TestBit2 
      CRC = (CRC And 32767) * 2 
      If TestBit = True Then 
       CRC = CRC Xor Poly 
      End If 
     Next J 
    Next I 
    Dim tmp As String 
    tmp = Hex(CRC) 
    CRCTCP.Text = tmp 
    getCRC16 = tmp 
End Function 
+0

' BitConverter.ToString (array4) '? _Converts числовое значение каждого элемента указанного массива байтов в эквивалентное шестнадцатеричное представление строки. –

+0

Привет, Алекс. Что случилось, когда вы используете bitconverter.tost кольцо, которое обрабатывает «b1: 68: de: 3a: 15: cd: 5b: 07» как «b» «1» «6», так как изменяется один символ и целая вещь. –

+0

- это шестнадцатеричное значение "123456789" "987654321". Вы можете попробовать калькулятор Windows для преобразования от десятичной до шестнадцатеричной. Но он будет показывать спереди назад. Когда вы отправляете какой-либо пакет, он преобразуется в шестнадцатеричный. –

ответ

0

Наконец, нашел.

Public Class CRC16CCITT 
    Public Enum InitialCRCValue 
     Zeroes = 0 
     NonZero1 = &HFFFF 
     NonZero2 = &H1D0F 
     'NonZero3 = &H0 
    End Enum 

    Private Const poly As UShort = &H1021 'polynomial 
    Dim table(255) As UShort 
    Dim intValue As UShort = 0 

    Public Function ComputeCheckSum(ByVal bytes As Byte()) As UShort 
     Dim crc As UShort = Me.intValue 
     'Dim x As String 
     For i As Integer = 0 To bytes.Length - 1 
      crc = CUShort(((crc << 8) Xor table(((crc >> 8) Xor (&HFF And bytes(i)))))) 
      'crc = (crc << 8)^(x << 15)^(x << 2)^x 
     Next 
     Return crc 
    End Function 

    Public Function ComputeCheckSumBytes(ByVal bytes As Byte()) As Byte() 
     Dim crc As UShort = ComputeCheckSum(bytes) 
     Return BitConverter.GetBytes(crc) 
    End Function 

    Public Sub New(ByVal initialvalue As InitialCRCValue) 
     Me.intValue = CUShort(initialvalue) 
     Dim temp, a As UShort 
     For i As Integer = 0 To table.Length - 1 
      temp = 0 
      a = CUShort(i << 8) 
      For j As Integer = 0 To 7 
       If ((temp Xor a) And &H8000) <> 0 Then 
        temp = CUShort((temp << 1) Xor poly) 
       Else 
        temp <<= 1 
       End If 
       a <<= 1 
      Next 
      table(i) = temp 
     Next 
    End Sub 
End Class 
Смежные вопросы