Python read() 自动将十六进制转换为字符?
我正在尝试把一个4x4的5.6.5.0.0格式的.bmp文件转换成RGB值的列表,以便可以放入另一个需要特定格式的程序中。但是我遇到了麻烦,因为我觉得Python中的read()方法在我使用数据之前就把一些数据转换了,即使我以“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来自动化这个过程。
顺便说一下,我觉得这可能也是那个人遇到的问题。
1 个回答
在Python中,字符串的内容会直接显示出来,但为了防止你的终端出现混乱,它会使用一些特殊的转义代码。任何不是可打印的ASCII字符的内容,都会用转义代码来表示。
不过,这个值本身依然是完全的二进制数据。
>>> '\x00'
'\x00'
>>> len('\x00')
1
>>> '\x65'
'e'
在上面的例子中,空字节显示为\x00
这个转义代码,但它仍然只有一个字节(长度为1)。而一个十六进制值为65的字节,会显示为e
,因为它是一个可打印的ASCII字符。