python правильный способ декодирования пакета raw udp
Я создаю скрипт для получения информации о сервере Valve (игроки онлайн, карта и т. д)
пакет, который я получаю, когда запрашиваю информацию, таков:
'xffxffxffxffIx11Stargate Central CAP SBEPx00sb_wuwgalaxy_fixx00garrysmodx00Spacebuildx00xa0x0fnx0cx00dwx00x0114.09.08x00xb1x87ix06xb4gx17.x15@x01gm:spacebuild3x00xa0x0fx00x00x00x00x00x00'
Это может помочь вам понять, что я пытаюсь сделать https://developer.valvesoftware.com/wiki/Server_queries#A2S_INFO
Проблема в том, что я не знаю, как правильно декодировать это, легко получить строку, но я понятия не имею, как получить другие типы, такие как byte и short
например 'xa0x0f'
Сейчас я делаю но знаете ли вы, есть ли лучший способ сделать это?
1 ответ:
Python имеет функции для кодирования / декодирования различных типов данных в байты. Взгляните на пакет
struct, функцииstruct.pack()иstruct.unpack()- ваши друзья.Взято из https://docs.python.org/2/library/struct.html
Первый аргумент функции>>> from struct import * >>> pack('hhl', 1, 2, 3) '\x00\x01\x00\x02\x00\x00\x00\x03' >>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03') (1, 2, 3)unpackопределяет формат данных, хранящихся во втором аргументе. Теперь вам нужно перевести описание, данное valve, в строку формата. Если вы хотите распаковать 2 байта и короткий из строки данных (которая будет иметь длину 4 байта, конечно), вы можете сделать что-то вроде этого:Вам придется позаботиться о себе, чтобы получить правильную часть строки данных (и я не знаю, подписаны ли эти числа или нет, обязательно позаботьтесь об этом тоже).(first_byte, second_byte, the_short) = unpack("cc!h", data)Строки, которые вам придется сделать по-другому (они здесь заканчиваются null, поэтому начните, если вы знаете, что строка начинается и читается до первого байта
"\0").
pack()на работе все наоборот. и хранит данные в байтовой строке. Взгляните на примеры в Python doc и немного поиграйте с ним, чтобы почувствовать его (например, когда кортеж возвращается/нужен).
structподдерживает вас в получении правильного порядка байтов, который большую часть времени является сетевым порядком байтов и отличается от вашей системы. Это, конечно, необходимо только для многобайтовых целых чисел (например, коротких) - так что строка формата `"!h " следует распаковать короткую правильно.
Comments