Python read()会自动将hex转换为char吗?

时间:2013-02-23 14:27:19

标签: python hex byte bmp

我正在尝试将4x4,5.6.5.0.0,.bmp文件转换为rgb值列表以插入需要特定格式的另一个程序,而我因为我认为读取而陷入困境( 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

This table表明'33'可以解释为'3','22'可以解释为''',我确信它应该是那样的 - 看看数据在文本中的显示方式编辑如下)。

现在,如果没有歧义,将所有符号转换回十六进制格式会很容易,但在更复杂的文件中有很多可能性。例如,如果我有序列'6666',它将被改为'ff',我将无法告诉appart我可能已经拥有的'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 aff eedd 0000 00ff   fff fdd bb00 0000 ffff ff00 0000 0000   00ff ffff 0000 00ff ffff fff ff00 0000   fff ff33 2211 0000

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

顺便说一下,我认为这也可能是this person发生的事情。

1 个答案:

答案 0 :(得分:4)

Python向您显示文字字符串值,并使用转义码来防止您的终端出现乱码。任何不是可打印的ASCII字符的东西都会显示为转义码。

值本身仍然是完全二进制

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

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