5

将python字符串解压缩到字段中的最佳方法是什么

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

它具有以下格式

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

(我还需要将其他不同格式的包解包到上面)

我该如何解压这些?

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

问候

X

4

5 回答 5

6

struct 模块旨在根据格式字符串将异构数据解包为元组。一次解压整个结构比尝试一次提取一个字段更有意义。这是一个例子:

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

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

fields[0]

您还可以使用元组来初始化 NamedTuple;查看struct 的文档以获取示例。NamedTuples 仅在 Python 2.6+ 中可用,但它们的行为更像 Python 结构,因为您可以将元素作为属性访问,例如 fields.header。当然,您也可以通过编写一个类来封装元组中的信息来完成这一点……再次,如果您愿意的话。正如我在上面展示的那样,您总是可以直接对字段进行索引。

于 2009-12-10T12:09:30.273 回答
4

使用struct模块

于 2009-12-10T09:55:12.833 回答
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)
于 2009-12-10T13:09:30.503 回答
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])

问候

于 2009-12-10T11:41:50.950 回答
0

看一下模块' struct '。

于 2009-12-10T09:57:43.227 回答