2009-07-15 11 views
2

私はバイナリファイルをリストに読み込み、バイナリデータを解析しています。 unpack()を使用してデータの特定の部分をプリミティブデータ型として抽出しています。そのデータを編集して元のバイトリストに戻したいと思います。 pack_into()を使用すると、Python 2.4を使用していて、pack_into()が2.5まで導入されていないことを除いて、簡単になります。バイトリストを操作するときにpack_into()を使用する代わりに?

データをこのようにシリアル化して達成する方法を知っている人はいますか?基本的にpack_into()と同じ機能ですか?

答えて

3

見たことがありますか?これは、structarrayモジュールを直接使用するよりも、バイナリデータの構築、解析、変更を容易にするように設計されています。

これは特にビットレベルで動作するように作られていますが、バイトだけでも動作します。 Python 2.4でも動作します。

from bitstring import BitString 
s = BitString(filename='somefile') 

# replace byte range with new values 
# The step of '8' signifies byte rather than bit indicies. 
s[10:15:8] = '0x001122' 

# Search and replace byte value with two bytes 
s.replace('0xcc', '0xddee', bytealigned=True) 

# Different interpretations of the data are available through properties 
if s[5:7:8].int > 1000: 
    s[5:7:8] = 1000 

# Use the bytes property to get back to a Python string 
open('newfile', 'wb').write(s.bytes) 

BitStringに保存されている基礎となるデータは、ちょうどarrayオブジェクトですが、機能や特別なメソッドの包括的なセットと、それは簡単な修正と解釈することにします。

1

バッファオブジェクト内のデータの編集を意味しますか?それらをPythonから直接操作することについてのドキュメントは、まれです。

文字列内のバイトを編集したい場合は、それだけで十分です。 struct.pack_intoは2.5に新しいですが、struct.packではありません:あなたはbitstringモジュールで

import struct 
s = open("file").read() 
ofs = 1024 
fmt = "Ih" 
size = struct.calcsize(fmt) 

before, data, after = s[0:ofs], s[ofs:ofs+size], s[ofs+size:] 
values = list(struct.unpack(fmt, data)) 
values[0] += 5 
values[1] /= 2 
data = struct.pack(fmt, *values) 
s = "".join([before, data, after]) 
関連する問題