Byte() en entier non signé dans .NET
-
21-12-2019 - |
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?
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)