Пытаясь декодировать сообщение UDP, это массив из 128 байтов, первая строка переменной длины начинается с 7-го байта. То, что я хотел бы сделать, это разделить массив на отдельные элементы и декодировать каждый элемент на основе типа (байт, строка). Формат / типы данных определены здесь: http://developer.valvesoftware.com/wiki/Server_queries#Goldsource_servers_2
Вот необработанные данные.
Получите буфер: 255 255 255 255 73 48 115 99 52 46 120 32 84 101 115 116 32 83 101 114 118 101 114 91 50 56 49 51 93 0 99 48 97 48 101 0 115 118 101 110 99 111 111 112 5
2 0 83 118 101 110 32 67 111 45 111 112 32 52 46 54 32 111 114 32 108 97 116 101 114 0 70 0 0 12 0 100 119 0 0 49 46 49 46 50 46 49 0 145 145 105 3 44 67 175 180 9 64 1
70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Вот как выглядит массив строк, разделенных на «0x00».
Ответ на строку: Сервер тестирования I0sc4.x [2813] c0a0e svencoop4 Sven Co-op 4.6 или более поздней версии @ ☺F
Это прекрасно работает до пятого элемента («F» после слова «позже»). После этого все немного искажается, и я не могу понять, как выбрать / декодировать оставшиеся элементы.
# convert to string.
$StringResponse = [Text.Encoding]::ASCII.GetString($ReceiveBuffer)
# make an array of strings.
$SplitString = $StringResponse.split([char][byte]"0x00")
# store the value of individual elements.
$servername_split = $SplitString[0].split([char]"0")
$Map = $SplitString[1]
$gamedirectory = $SplitString[2]
$gamedescription = $SplitString[3]
$appid = [byte][char]$splitstring[4]
Работа с необработанными данными:
Это работает для доступа к первой паре байтовых элементов после четырехбайтового заголовка 255, 255, 255, 255. Затем начинаются строки переменной длины.
$type = [char]$ReceiveBuffer[4]
$NetworkProtocolVersion = $ReceiveBuffer[5]
Так что я не могу сделать это, чтобы получить доступ к байтовым элементам в конце необработанных данных, если я заранее не знаю, сколько байтов используется строковыми данными переменной длины.
$numplayers = $ReceiveBuffer[72]
$maxnumplayers = $ReceiveBuffer[73]
$numbots = $ReceiveBuffer[74]
$dedicated = [char]$ReceiveBuffer[75]
$os = [char]$ReceiveBuffer[76]
$passwordreq = $ReceiveBuffer[77]
$secure = $ReceiveBuffer[78]
Вывод на консоль:
Type: I
Network Protocol Version: 48
Server Name: sc4.x Test Server[2813]
Map: c0a0e
Game Directory: svencoop4
Game Description: Sven Co-op 4.6 or later
AppID: 70
ТИА