Pregunta

He estado intentando manejar paquetes y bytes por primera vez, y hasta ahora no he podido obtener la longitud del paquete correctamente después de muchas técnicas diferentes.

Código:

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

Hasta ahora, todos mis intentos de que la consola escriba la longitud de los datos han resultado fallidos.Validé el endianismo y de hecho escribí los bytes para verificar que estaba manejando los datos correctos.

Bytes de ejemplo:

00 00 00 24 -> UINT32 tiene 36 bytes, pero obtengo una serie de números enteros como 3808493568

¿Cómo puedo arreglar esto?

¿Fue útil?

Solución

Estoy de acuerdo con Hans, la endianidad es tu problema.Además, te recomiendo que utilices el BitConverter clase sobre el clientPacket matriz, más fácil que usar transmisiones.

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

Para su código, creo que esto podría funcionar (no probado):

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top