0

特定の形式を必要とする別のプログラムにプラグインするために、4x4、5.6.5.0.0、.bmp ファイルを RGB 値のリストに変換しようとしています。 「rb」モードで開いた場合でも、Python はデータの一部を使用する前に変換しています。

たとえば、使用する場合:

f = open("imgFile.bmp", "rb")
imgData=f.read()
f.close()

print imgData

私は得る:

BMh\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00\x04\x00\x00\x00\xfc\xff\xff\xff\x01\x00\x18 \x00\x00\x00\x00\x002\x00\x00\x00\x12\x0b\x00\x00\x12\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc \xbb\xaa\xff\xee\xdd\x00\x00\x00\xff\xff\xff\xdd\xcc\xbb\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00 \x00\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff3"\x11\x00\x00

ほとんどの場合、これで問題ありません (bmp ヘッダーの後に必要な 16 進値を取得できます。これらの値は「\xcc\xbb\xaa . . .」で始まりますが、一部の 16 進値が他の文字として解釈されているようです。シンボルは、少なくとも翻訳を困難にしますが、最悪の場合、元のデータを確実に復元することを不可能にするあいまいさをもたらします。

たとえば、文字列の末尾近くに次のシーケンスがあります。

\xff3"\x11

次のように表示されます。

\xff\x33\x22\x11

(この表は、'33' が '3' として、'22' が '"' として解釈できることを示しており、そのように解釈されるべきであると確信しています。以下のテキスト エディターでデータがどのように表示されるかを参照してください)。

あいまいさがなければ、すべてのシンボルを 16 進形式に戻すのは簡単ですが、より複雑なファイルでは多くの可能性があります。たとえば、シーケンス「6666」がある場合、「ff」に変更されるだけで、データに既に含まれている可能性のある「ff」のインスタンスとは区別できません。

私の質問は、Python でさらに解析およびフォーマットするために、データを翻訳せずに明確に保つにはどうすればよいですか?

説明したことが起こっていることを確認するために、SublimeText でファイルを開きました。次のように表示されます。

424d 6800 0000 0000 0000 0000 3600 0000 2800 0000 0400 0000 FCFF FFFF 0100 1800 0000 0000 0000 0000 0000 0000 0000 0000 00000000000000000000 0000 CCBB AAFF FFFF FFFFAPPA 00FFFFAPPA 00FFFAM 2211 0000

、これは正しくて使用可能です (私の目的には効率的ではありませんが、毎回テキスト エディターで開かなければなりません)。そのため、Python を使用してプロセスを自動化したいと考えています。

ちなみに、この人もそうだったのではないかと思います。

4

1 に答える 1

4

Python はリテラル文字列値を表示し、エスケープ コードを使用して端末が混乱するのを防ぎます。印刷可能な ASCII 文字でないものはすべて、代わりにエスケープ コードとして表示されます。

値自体はまだ完全にバイナリです。

>>> '\x00'
'\x00'
>>> len('\x00')
1
>>> '\x65'
'e'

上記の例では、ヌル バイトが\x00エスケープ コードとして表示されますが、それでも 1 バイト (長さ 1) です。16 進値 65 のバイトeは、印刷可能な ASCII 文字であるため、 として表示されます。

于 2013-02-23T14:28:21.440 に答える