在Python中,将十六进制文件解码为十进制“字面值”等价物
我有一个包含小数点后前一亿位π(圆周率)的十六进制文件,在十六进制编辑器里看起来是这样的:
14 15 92 65 35 89 79 32 etc.
我需要把它转换成字符串(最终还要转成整数)'1415926435897932'等等。所以其实不需要从十六进制转换成十进制,因为它本身就是十进制,只是以十六进制字节的形式存在。(我在标题中用引号提到“字面量”,可能这个词用错了,因为它暗示了一个字符串字面量。)
当我尝试用Python读取这个文件时,遇到了各种编码问题(因为第一个字节15是一个不可打印字符等等)。
比如说:
>>> f = open('pi100m.hexbin.000', 'rb')
>>> contents = f.read()
>>> f.close()
>>> snippet = contents[:50]
>>> snippet
'\x14\x15\x92e5\x89y28F&C82yP(\x84\x19qi9\x93u\x10X \x97IDY#\x07\x81d\x06(b\x08\x99\x86(\x03H%4!\x17\x06y'
>>> # if I 'print snippet', I get those question marks in triangles
>>> # for the nonprinting characters, they do not reproduce
>>> # in stackoverflow
我试过很多StackOverflow的文章和Python的帮助文档,感觉我可能漏掉了一些非常基础的东西。
2 个回答
1
snippet = '\x14\x15\x92e5\x89y28F&C82yP(\x84\x19qi9\x93u\x10X \x97IDY#\x07\x81d\x06(b\x08\x99\x86(\x03H%4!\x17\x06y'
''.join([str(ord(x)/16)+str(ord(x)%16) for x in snippet])
.
'1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'
3
先把数据编码成十六进制,这样你至少可以得到一个字符串表示:
integer_string = contents.encode('hex')
示例:
>>> snippet = '\x14\x15\x92e5\x89y28F&C82yP(\x84\x19qi9\x93u\x10X \x97IDY#\x07\x81d\x06(b\x08\x99\x86(\x03H%4!\x17\x06y'
>>> snippet.encode('hex')
'1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'
这基本上就是你的十六进制编辑器所做的事情,把字节表示成十六进制字符。