2009-12-10 42 views
4

什么会拆包一个Python字符串转换成田解码打包数据放入结构

我从TCP套接字接收数据的最佳方式,它是挤满如下,我相信这将是从一个字符串插座recv函数

它具有以下格式

UINT8 - 头
UINT8 - 长度
UINT32 - TYPEID
UINT16 -param1
UINT16 -param2
UINT16 -param3
UINT16 -param4
的char [24] - 名字符串
UINT32 - 校验
UINT8 - 页脚

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

如何解开这些?

我是新来的python,做了一点'C'。如果我使用'C',我可能会使用一个结构,这是否会成为Python的路?

问候

X

回答

6

结构模块旨在根据格式字符串将异构数据解包到元组。一次解包整个结构比一次尝试抽出一个域更有意义。这里有一个例子:

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

然后你就可以访问某一领域,例如第一场:

fields[0] 

您也可以使用元组来初始化NamedTuple;以documentation for struct为例。 NamedTuples只在Python 2.6+可用,但他们的行为更像可以访问元素属性的Python结构,例如fields.header。当然,你也可以多一点的工作,通过写一个类从数组封装信息......再次,如果你愿意做到这一点。正如我上面所展示的那样,您总是可以直接在字段中进行索引。

+0

感谢,这正是我一直在寻找 问候 – mikip 2009-12-10 12:59:41

0

看一看模块 'struct'。

+0

同样的建议。 – 2012-11-15 12:00:47

1

这是这样做的最好的方法还是有更好的办法

很可能会有其它格式的字符串,这将需要一个不同的拆包方案

字段1 = struct.unpack( '!I' 'B',数据[0])
FIELD2 = struct.unpack( 'B',数据[1])
字段3 = struct.unpack(,数据[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' ,数据[14时38分])
字段9 = struct.unpack( '!I',数据[38:42])
字段10 = struct.unpack( 'B',数据[42])

此致

+0

当然有。无需分别获取每个字段。见musicinmybrain的回答为例(http://stackoverflow.com/questions/1879914/decoding-packed-data-into-a-structure/1880563#1880563)。 – atzz 2009-12-10 12:27:44

+0

谢谢,刚刚看到musicbrains响应 谢谢大家对你的时间,大加赞赏 – mikip 2009-12-10 13:00:23

4

这是回答你的问题,作为安回答:

肯定不可能是最好的方式,因为它不工作。 struct.unpack()总是返回一个元组。为了挖出单项在元组,你需要做的要么field1 = struct.unpack('B',data[0])[0]field1, = struct.unpack('B',data[0])

即使与修复,这不是一个好办法:太多了打字,不必要的错误倾向[开始:结束],10函数的调用效率低下,而不是一个。

正如你的名字,你可以用它们来代替字段1或字段[0] ...这样的:如以前@SilentGhost提供

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

感谢约翰,更胜一筹,大加赞赏 – mikip 2009-12-10 13:44:33

+1

感谢文字表达你的赞赏。你知道你可以改变你选择的答案吗? – 2009-12-10 21:44:11