将python字符串解压缩到字段
的最佳方法是什么?我有从tcp套接字收到的数据,它打包如下,我相信它将在套接字recv函数的字符串中
它具有以下格式
uint8 - 标题
uint8 - 长度
uint32 - typeID
uint16 -param1
uint16 -param2
uint16 -param3
uint16 -param4
char [24] - 名称字符串
uint32 - 校验和
uint8 - 页脚
(我还需要解压缩上述不同格式的其他数据包)
如何解压缩这些?
我是python的新手,已经做了一点'C'。如果我使用'C'我可能会使用一个结构,这会是Python的方式吗?
此致
X
答案 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”。