Question

J'ai essayé de gérer des paquets et des octets pour la première fois, et je n'ai pas réussi à obtenir correctement la longueur du paquet jusqu'à présent après de nombreuses techniques différentes.

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

Jusqu'à présent, toutes mes tentatives pour que la console écrive la longueur des données ont abouti à un échec.J'ai validé le caractère boutiste et j'ai écrit les octets pour vérifier que je traitais les données correctes.

Exemples d'octets :

00 00 00 24 -> UINT32 fait 36 ​​octets, mais j'obtiens un tableau d'entiers comme 3808493568

Comment puis-je réparer cela?

Était-ce utile?

La solution

Je suis d'accord avec Hans, l'endianisme est votre problème.De plus, je vous recommande d'utiliser le BitConverter cours sur le clientPacket tableau, plus facile que d’utiliser des flux.

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

Pour votre code, je pense que cela pourrait fonctionner (non testé) :

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top