python正确解码原始udp数据包的方法

时间:2015-04-24 14:18:32

标签: python decode packet

我正在编写一个脚本来获取Valve的服务器信息(玩家在线,地图等) 我收到信息时收到的数据包是:

'\xff\xff\xff\xffI\x11Stargate Central CAP SBEP\x00sb_wuwgalaxy_fix\x00garrysmod\x00Spacebuild\x00\xa0\x0f\n\x0c\x00dw\x00\x0114.09.08\x00\xb1\x87i\x06\xb4g\x17.\x15@\x01gm:spacebuild3\x00\xa0\x0f\x00\x00\x00\x00\x00\x00'

这可以帮助您了解我正在尝试做的事情https://developer.valvesoftware.com/wiki/Server_queries#A2S_INFO

问题是,我不知道如何正确解码这个,很容易得到字符串,但我不知道如何获得其他类型,如字节和短 例如'\xa0\x0f'

现在我正在做多次拆分,但你知道有没有更好的方法呢?

1 个答案:

答案 0 :(得分:4)

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个字节和一个short(当然,它的长度为4个字节),你可以这样做:

(first_byte, second_byte, the_short) = unpack("cc!h", data)

你必须自己照顾,获取数据字符串的正确部分(我不知道这些数字是否已签名,请务必注意这一点)。

您必须以不同方式执行的字符串(它们在此处以空值终止,因此您知道字符串开始并读取到第一个"\0"字节)。

pack()反过来工作并将数据存储在字节字符串中。看一下python doc上的例子并稍微考虑一下它就能感受到它(当返回/需要一个元组时,例如。)。

struct支持您获得正确的字节顺序,其中大部分时间是网络字节顺序,与您的系统不同。这当然只对多字节整数(如短)有必要 - 所以``!h'的格式字符串应正确解包短文。