1

バイナリでファイルに書き込みたい次の辞書があります。

data = {(7, 190, 0): {0: 0, 1: 101, 2: 7, 3: 0, 4: 0}, 
        (7, 189, 0): {0: 10, 1: 132, 2: 17, 3: 20, 4: 40}}

この方法で struct モジュールを使用することにしました。

packed=[]
for ssd, add_val in data.iteritems():
    # am trying to using 0xcafe as a marker to tell me where to grab the keys 
    pack_ssd = struct.pack('HBHB', 0xcafe, *ssd) 
    packed.append(pack_ssd)
    for add, val in data[ssd].iteritems():
        pack_add_val = struct.pack('HH', add, val)
        packed.append(pack_add_val)

この出力はパックされています = ['\xfe\xca\x07\x00\xbe\x00\x00', '\x00\x00\x00\x00', '\x01\x00e\x00', '\x02\x00 \x07\x00'、'\x03\x00\x00\x00'、'\x04\x00\x00\x00'、'\xfe\xca\x07\x00\xbd\x00\x00'、'\x00\x00 \n\x00'、'\x01\x00\x84\x00'、'\x02\x00\x11\x00'、'\x03\x00\x14\x00'、'\x04\x00(\x00']

その後、これをバイナリ ファイルとして書き込みます。

ifile = open('test.bin', 'wb')
for pack in packed:
    ifile.write(pack)

バイナリ ファイルは次のようになります。 \x00\x00\x04\x00\x00\x00\xfe\xca\x07\x00\xbd\x00\x00\x00\x00\n\x00\x01\x00\x84\x00\x02\x00\x11\x00 \x03\x00\x14\x00\x04\x00(\x00'

データを解凍するまでは問題ありません。ここで、バイナリ ファイルの内容を読み取り、最初に辞書がどのように表示されたかに戻します。これは私がそれを解凍しようとした方法ですが、常にエラーが発生していました:

unpack=[]
while True:
chunk = ifile.read(log_size)
if len(chunk) == log_size:
    str = struct.unpack('HBHB', chunk)
    unpack.append(str)
    chunk = ifile.read(log1_size)
    str= struct.unpack('HH', chunk)
    unpack.append(str)

Traceback (most recent call last):
File "<interactive input>", line 7, in ?
error: unpack str size does not match format

解凍しようとした方法では常に問題が発生することはわかっていますが、バイナリ ファイルの内容を解凍する良い方法が見つからないようです。どんな助けでも大歓迎です..

4

1 に答える 1

1

何かカスタムを書く必要がある場合は、次のことをお勧めします。

1) 64 ビット整数: キーの数

2) 64 ビット整数 * 3 * キーの数: キーのタプル データ

キーの数の i の場合:

3i) 64 ビット整数: 辞書 i のキーの数

4i): 64 ビット整数 * 2 * i のキーの数: キー データ、値データ、キー データ、値データ...

その後、同じエンディアンで読み取りと書き込みを行い、任意の時点で無効な長さ (高すぎる、低すぎる) を指定してもプログラムがクラッシュしないことを確認してください。

アイデアは、アンパッカーのどの状態でも、長さを期待しているか、データを何かとして読み取るため、フォーマットに従っている限り、すべてがどこで始まりどこで終わるかが 100% 明確であるということです。

于 2013-05-07T03:49:59.300 に答える