将打包数据解码为结构

时间:2009-12-10 09:50:47

标签: python string unpack

将python字符串解压缩到字段

的最佳方法是什么?

我有从tcp套接字收到的数据,它打包如下,我相信它将在套接字recv函数的字符串中

它具有以下格式

uint8 - 标题
uint8 - 长度
uint32 - typeID
uint16 -param1
uint16 -param2
uint16 -param3
uint16 -param4
char [24] - 名称字符串
uint32 - 校验和
uint8 - 页脚

(我还需要解压缩上述不同格式的其他数据包)

如何解压缩这些?

我是python的新手,已经做了一点'C'。如果我使用'C'我可能会使用一个结构,这会是Python的方式吗?

此致

X

5 个答案:

答案 0 :(得分:6)

struct模块用于根据格式字符串将异构数据解压缩到元组。一次解包整个结构而不是一次尝试拉出一个字段更有意义。这是一个例子:

fields = struct.unpack('!BBI4H20sIB', data)

然后您可以访问给定字段,例如第一个字段:

fields[0]

您还可以使用元组初始化NamedTuple;查看documentation for struct的示例。 NamedTuples仅在Python 2.6+中可用,但它们的行为更像Python结构,因为您可以将元素作为属性访问,例如fields.header。当然,你也可以通过编写一个类来封装来自元组的信息来完成更多的工作......如果你关心的话。您可以随时直接索引字段,如上所示。

答案 1 :(得分:4)

使用struct模块

答案 2 :(得分:4)

这是对你的问题的回答:

这肯定不是最好的方法,因为它不起作用。 struct.unpack()总是返回一个元组。要取出该元组中的单个项目,您需要执行field1 = struct.unpack('B',data[0])[0]field1, = struct.unpack('B',data[0])

即使有了这个修复,它也不是一个好方法:输入太多,不必要的错误倾向[start:end],10个函数调用的效率低而不是一个。

由于你有名字,你可以使用它们而不是field1或field [0] ......就像这样:

(header, length, typeID, param1, param2,
param3, param4, name_string, checksum, footer,
) = struct.unpack("!2B I 4H 24s I B", data)

答案 3 :(得分:1)

这是最好的方法吗?还是有更好的方式

可能会有其他格式的字符串需要不同的解包方案

field1 = struct.unpack('B',data [0])
field2 = struct.unpack('B',data [1])
field3 = struct.unpack('!I',data [2:6])
field4 = struct.unpack('!H',data [6:8])
field5 = struct.unpack('!H',data [8:10])
field6 = struct.unpack('!H',data [10:12])
field7 = struct.unpack('!H',data [12:14])
field8 = struct.unpack('20s',data [14:38])
field9 = struct.unpack('!I',data [38:42])
field10 = struct.unpack('B',data [42])

此致

答案 4 :(得分:0)

查看模块“struct”。