2009-12-10 57 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