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'



Сейчас я делаю но знаете ли вы, есть ли лучший способ сделать это?

498   1  

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

    Ничего не найдено.