2009-11-14 70 views
9

在Python中,我正在通過讀取一個字符串來訪問二進制文件,然後使用struct.unpack(...)。現在我想使用struct.pack_into(...)寫入該字符串,但出現錯誤「無法使用字符串作爲可修改的緩衝區」。什麼是適合struct模塊的緩衝區?什麼是適用於Python結構模塊的緩衝區

+0

您正在使用哪個版本的python?我已經玩過一些結構,但之前沒有看到過。 – chrism1

+0

我正在使用Python 2.6.4 – mdm

回答

6

如果您不想將其打包到特定對象中,只需使用struct.pack即可返回字符串。

否則,ctypes.create_string_buffer是獲取可變緩衝區的一種方法。

+0

緩衝區是簡單虛擬機的內存,所以我需要打包到特定的對象中。內存很小,但爲單個內存訪問複製128-512k不是一種選擇。 – mdm

6

正如在另一個答案中指出的,struct_pack可能是你所需要和應該使用的。然而,array類型的對象支持緩衝協議,並且可以進行修改:

>>> import array, struct 
>>> a = array.array('c', ' ' * 1000) 
>>> c = 'a'; i = 1 
>>> struct.pack_into('ci', a, -0, c, i) 
>>> a 
array('c', 'a\x00\x00\x00\x01\x00\x00\x00 ... 

原始緩衝協議是一個黑客位的主要爲C擴展。它已被棄用,並在Python 3中被替換爲new C-level buffer API and memoryview objects(即將在2.7版中)。

-1

兩種可能性立即躍升至心靈:

  • 您可以使用Python stringio模塊進行讀/寫文件的語義緩衝。

  • 您可以使用Python array模塊獲取一個緩衝區,您可以像列表一樣對待,但只包含二進制字節。