在Python中,将hex文件解码为十进制'literal'等价物

时间:2014-06-22 00:31:29

标签: python python-2.7 character-encoding hex

我有十六进制后的前1亿个pi的十六进制文件,在十六进制编辑器中它看起来像这样:

14 15 92 65 35 89 79 32 etc.

我需要将其转换为字符串(最终为整数)'1415926435897932'等。所以它不需要从十六进制“转换”为十进制,它已经是十进制,就像十六进制字节一样。 (我在标题中的引号中使用了'literal'这个词,它可能完全是错误的单词,因为它暗示了一个字符串文字。)

当我尝试在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 个答案:

答案 0 :(得分: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'

这基本上是你的十六进制编辑器所做的,将字节表示为十六进制字符。

答案 1 :(得分: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'