Byte() a entero sin signo en .NET
-
21-12-2019 - |
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?
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)