从图像中读取十六进制数据的问题 - python 自动转换为字符串
我正在用 read(1)
一次读取一个字节的方式来读取一张图片,并把它添加到一个列表里。这个图片的数据都是十六进制的。当我用 print
函数打印这个列表时,它的格式是 '\xd7'
。
['\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7', '\xd7',...]
问题是,现在我需要对这些十六进制数据进行一些计算,但它们是字符串格式,而这种 '\xd'
的字符串格式在 Python 中没有被任何整数或十六进制转换函数支持。它们需要的是 '0xd7'
或者只是 'd7'
。
谢谢你的帮助
5 个回答
2
你可以像这样把它们放进一个数字数组里:
import array
data = array.array('B') # array of unsigned bytes
with open("test.dat", 'rb') as input:
data = input.read(100)
data.fromstring(data)
print data
# array('B', [215, 215, 215, 215, 215, 215, 215])
4
它把这些当成字符来理解,所以你需要用ord这个函数把它们转换成数字。比如说,ord('\xd7')
会返回215这个数字。
另外,如果你在使用Windows系统,或者这个程序可能要在Windows上运行,记得要以二进制模式打开文件:open("imagefile.png","rb")
。在其他操作系统上这样做就没什么区别。
2
如果你需要的是 'd7'
或 '0xd7'
,而不仅仅是 0xd7
(也就是215),那么可以使用 hex()
函数或者 '%x'
格式。
>>> ord('\xd7')
215
>>> ord('\xd7') == 215 == 0xd7
True
>>> hex(ord('\xd7'))
'0xd7'
>>> '%x' % ord('\xd7')
'd7'
另外,正如其他回答中提到的,确保在模式中以 'b' 开头,否则在某些字节序列上,它可能会搞混,误认为是UTF-8之类的格式。