0

我正在尝试将 4x4、5.6.5.0.0、.bmp 文件转换为 rgb 值列表以插入另一个需要特定格式的程序,但我被卡住了,因为我认为 read() 方法在Python 在我可以使用它之前转换了一些数据,即使我在“rb”模式下打开它也是如此。

例如,当我使用:

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 标头之后获取我需要的十六进制值 - 这些值从“\xcc\xbb\xaa ......”开始,但看起来一些十六进制值被解释为其他字符并且符号,这至少会使翻译变得更加困难,但最坏的情况是会导致歧义,从而无法确定地恢复原始数据。

例如,您会在字符串末尾附近找到此序列:

\xff3"\x11

这应该显示为:

\xff\x33\x22\x11

此表显示,'33' 可以解释为 '3','22' 可以解释为 '"',我确信它应该是这样的 - 请参阅下面的文本编辑器中的数据显示方式)。

现在,如果没有歧义,将所有符号转换回十六进制格式会很容易,但在更复杂的文件中有很多可能性。例如,如果我有序列“6666”,它只会被更改为“ff”,我将无法从我的数据中可能已经存在的“ff”实例中分辨出来。

我的问题是:如何保持数据未翻译和明确,以便在 Python 中进一步解析和格式化?

为了确认我所描述的正在发生,我在 SublimeText 中打开了该文件,它显示为:

424D 6800 0000 0000 0000 3600 0000 2800 0000 0400 0000 FCFF FFFF 0100 1800 0000 0000 3200 0000 120B 0000 120B 0000 0000 0000 0000 0000 CCBB aaff EEDD 0000 00FF FFFF DDCC bb00 0000 FFFF FF00 0000 0000 00FF FFFF 0000 00FF FFFF FFFF FF00 0000 FFFF FF33 2211 0000

,这是正确且可用的(虽然对我的目的来说效率不高,每次都必须在文本编辑器中打开),所以我想用 Python 自动化这个过程。

顺便说一句,我认为这可能也是这个人正在发生的事情。

4

1 回答 1

4

Python 向您显示一个文字字符串值,并使用转义码来防止您的终端失控。任何不是可打印 ASCII 字符的内容都显示为转义码。

值本身仍然是完全二进制的。

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

在上面的例子中,空字节显示为\x00转义码,但它仍然只有一个字节(长度为 1)。十六进制值为 65 的字节显示为 an,e因为它是可打印的 ASCII 字符。

于 2013-02-23T14:28:21.440 回答