Byte() zu vorzeichenloser Ganzzahl in .NET
-
21-12-2019 - |
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?
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)