Frage

Ich habe zum ersten Mal versucht, mit Paketen und Bytes umzugehen, und konnte die Paketlänge nach vielen verschiedenen Techniken bisher nicht richtig ermitteln.

Code:

Public Shared Sub Client(packet As Packet)
    Console.WriteLine( _ 
      "Client -> " & _
      packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") & _
      " length:" & Convert.ToString(packet.Length))

    'Define Byte Array
    Dim clientPacket As Byte() = packet.Buffer

    ' Open a Binary Reader
    Dim memStream As MemoryStream = New MemoryStream(clientPacket)
    Dim bReader As BinaryReader = New BinaryReader(memStream)

    ' Remove the Ethernet Header
    Dim ethBytes As Byte() = bReader.ReadBytes(14)

    ' Remove the IPv4 Header
    Dim IPv4Bytes As Byte() = bReader.ReadBytes(20)

    ' Remove the TCP Header
    Dim TCPBytes As Byte() = bReader.ReadBytes(20)

    ' Get the packet length
    If clientPacket.Length > 54 Then
        Dim len As UInt32 = bReader.ReadUInt32
        Console.WriteLine(len)
    End If
End Sub

Bisher sind alle meine Versuche, die Datenlänge von der Konsole schreiben zu lassen, fehlgeschlagen.Ich habe die Endianness validiert und die Bytes tatsächlich ausgeschrieben, um zu überprüfen, ob ich die richtigen Daten verarbeitet habe.

Beispielbytes:

00 00 00 24 -> UINT32 ist 36 Bytes, aber ich erhalte ein Array von Ganzzahlen wie 3808493568

Wie kann ich das beheben?

War es hilfreich?

Lösung

Ich stimme Hans zu, Endianness ist Ihr Problem.Außerdem würde ich Ihnen empfehlen, das zu verwenden BitConverter Klasse auf der clientPacket Array, einfacher als die Verwendung von Streams.

Dim len As UInt32
Dim arr() As Byte
arr = {0, 0, 0, 24}
len = BitConverter.ToUInt32(arr, 0)
Console.Write(len.ToString) 'returns 402653184

arr = {24, 0, 0, 0}
len = BitConverter.ToUInt32(arr, 0)
Console.Write(len.ToString) 'returns 24

Für Ihren Code denke ich, dass dies funktionieren könnte (ungetestet):

If clientPacket.Length > 54 Then
  Dim lenBytes As Byte() = bReader.ReadBytes(4)
  Array.Reverse(lenBytes, 0, 4)
  Dim len As UInt32 = BitConverter.ToUInt32(lenBytes, 0)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top