1

基本的に、編集後にファイルに文字列を書き込もうとしているだけであり、概念実証として、無意味な変更を加えようとしています。ただし、以下の例に示すように、これでも何らかの理由で出力のサイズが 2 倍になります。なぜこれが起こっているのか誰にも分かりますか?

content = StringIO.getvalue()
with open("real.png", 'wb') as dump:
    dump.write(content) #35KB
content = [str(ord(char)) for char in content]
content = "".join([hex(int(char)).lstrip("0x").zfill(2) for char in content])
with open("new.png", "wb") as dump:
    dump.write(content) #70KB
4

1 に答える 1

7

すべてのバイトを、そのバイトの 16 進値を表す 2 バイトの文字列に変換しています。16 進文字列表現は、元のバイトと同じではありません。

ファイルのサイズが2倍にならなかったとしたら、私は非常に驚くでしょう。

HEX エディターを使用して、バイトを 16 進文字として表示する元の画像を表示している場合、そのデータの 1 つのエディター表現とファイルの実際の内容を混同しています。

そのタスクをより効率的に実行したい場合は、binascii.hexlify()関数を使用して、はるかに少ないコードで実行できます。ミラー操作は次のように呼ばれbinascii.unhexlify()ます。

from binascii import hexlify, unhexlify

content = StringIO.getvalue()
hex_content = hexlify(content)
same_content = unhexlify(hex_content)
assert content == same_content
于 2013-07-09T15:17:51.793 に答える