2013-12-07 44 views
0

我需要將輸入值打包到結構中,並將其打包爲32位#(無符號整數)。將字節碼字符串包裝爲結構爲32位值

一個例子輸入 '\ X08 \ X08 \ X08 \ X08'

然而,這不起作用:

>>> s = struct.pack('I', '\x08\x08\x08\x08') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
struct.error: cannot convert argument to integer 

我在做什麼錯?包裝它作爲int()不起作用:

>>> int('\x08\x08\x08\x08', 16) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 16: '\x08\x08\x08\x08' 

我試圖建立一個結構,其中有一個其他打包值之前和之後這一個。例如,我想

inp = '\x08\x08\x08\x08' 
s = struct.pack('HHIH', 50, 100, inp, 100) 

返回

'2\x00d\x00\x08\x08\x08\x08d\x00' 
+0

打包到'I'需要*整數*輸入。你確定你不是想要*解壓縮*嗎? –

+0

如果你使用的是python3.2或更新的版本,你可以使用'int.from_bytes' – mgilson

回答

1

什麼 - 究竟 - 你要爲輸出? struct.pack()會返回(如果它工作)一個字符串完全一樣,你傳入一開始。 struct.unpack('I', '\x08\x08\x08\x08')返回元組(134744072,)。這回struct.pack(),你拿回串進你開始:

>>> import struct 
>>> struct.unpack('I', '\x08\x08\x08\x08') 
(134744072,) 
>>> struct.pack('I', _[0]) 
'\x08\x08\x08\x08' 

這一切正在按記錄,並預期。所以請清楚你想要的是什麼。

我能不能像做struct.pack( 'H',someValue中)+ '\ X08 \ X08 \ X08 \ X08' + struct.pack( 'H',someothervalue)使 一個大結構?

也許吧。這取決於你沒有說明的東西,比如你是否使用struct自動插入填充字節(用於對齊)。如果您自己將字符串粘貼在一起,那麼您有責任讓這一切順利。

如果您決定確實想要粘貼一個4字節的字符串,那麼使用struct格式代碼4s是一種更簡單的方法。

+0

嗯。我只是希望它包含在我的結構中,因爲我正在打包值之前和之後的值。我能做一些像struct.pack('H',somevalue)+'\ x08 \ x08 \ x08 \ x08'+ struct.pack('H',someothervalue)來創建一個大結構嗎? – user1436111

+0

只是一個想法:我不知道很多人都知道交互式解釋中的'_'技巧。我傾向於在這裏不使用它,因爲人們可能會開始認爲'_'在* non * interactive解釋器中有一些神奇的屬性,這不是一件好事,因爲'_'是傳統的「未使用」變量。 – mgilson

+0

請編輯您的問題,給出*完整*(所有輸入和所有期望的輸出)的例子*完全*你想要什麼。不要試圖描述它 - 顯示它。 –

0

字符串'\ x08 \ x08 \ x08 \ x08'已經是一個整數的「打包」表示。 如果你想將其轉換爲一個Python整數,你應該試試這個:

struct.unpack('I','\x08\x08\x08\x08') 

當然,要注意字節順序。

相關問題