Byte() для целого числа без знака в .NET
-
21-12-2019 - |
Вопрос
Я впервые пробовал свои силы в обработке пакетов и байтов, и мне до сих пор не удалось правильно получить длину пакета после многих различных методов.
Код:
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
До сих пор все мои попытки заставить консоль записать длину данных закончились неудачей.Я проверил порядок байтов и фактически записал байты, чтобы убедиться, что я обрабатываю правильные данные.
Пример байтов:
00 00 00 24 -> UINT32 имеет размер 36 байт, но я получаю массив целых чисел, например 3808493568
Как я могу это исправить?
Решение
Я согласен с Гансом, ваша проблема - порядок байтов.Кроме того, я бы рекомендовал вам использовать BitConverter
класс на clientPacket
массив, проще, чем использовать потоки.
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
Я думаю, что для вашего кода это может сработать (непроверено):
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)
Не связан с StackOverflow