转换十六进制文件并提取/显示属于某种语言的字符

时间:2014-01-15 16:59:19

标签: python unicode

我正在解析包含ascii字符的文件,但是十六进制格式(例如A)在文件中表示为65。 所以文件内容如下所示:

60 42 00 64 62 D6 52 20 4E 65 75 2D 55 6C 6D 20 2F 20 45 76 C4

我正在尝试从属于语言集的文件中提取有用信息。 我不知道文件是如何保存的(如果是utf-8或utf-16) 我正在尝试编写一个python程序,我的第一个方法是将整行结合起来,这样看起来像这样

fd = open('file.txt', 'r')
x = fd.readline()
x_split = x.split(' ')    
x_split = ', '.join(x_split)
x_split = x_split.replace(', ', '\\x')
x_split = u'\\x'+ x_split   
# here the line should look like '\x60\x42\x00\x64\x62\xD6\x52\x20\x4E\x65\x75\x2D\x55\x6C\x6D\x20\x2F\x20\x45\x76\xC4'
print x_split               
# here i assumed that the above hexadecimal numbers would be shown as alphabets.

我假设它应该返回Abcd等字符,而是打印整行再次(以数字形式)打印文件中的内容。

1 个答案:

答案 0 :(得分:2)

你没有产生可以解码成字符串的字节;你只是在字母和数字之前创建一个包含大量\x个字符的字符串。

>>> x = "60 42 00 64 62 D6 52 20 4E 65 75 2D 55 6C 6D 20 2F 20 45 76 C4"
>>> x_split = x.split(' ')    
>>> x_split = ', '.join(x_split)
>>> x_split = x_split.replace(', ', '\\x')
>>> x_split = u'\\x'+ x_split   
>>> x_split
u'\\x60\\x42\\x00\\x64\\x62\\xD6\\x52\\x20\\x4E\\x65\\x75\\x2D\\x55\\x6C\\x6D\\x20\\x2F\\x20\\x45\\x76\\xC4'

同样,这只是一个包含大量字符的字符串。其中一些碰巧与十六进制相同,基本上是无关紧要的。

如果你想要一个字节数组,你可以做一些像

这样的事情
>>> bb = bytearray(int(b, 16) for b in x.split())
>>> bb
bytearray(b'`B\x00db\xd6R Neu-Ulm / Ev\xc4')

然后如果你知道编码,你可以从中得到一些东西。例如,这是一个随机猜测:

>>> bb.decode("iso-8859-2")
u'`B\x00db\xd6R Neu-Ulm / Ev\xc4'
>>> print bb.decode("iso-8859-2")
`BdbÖR Neu-Ulm / EvÄ

但是关于编码的不同假设将给出不同的结果。 (一个粗略的比喻:除非你知道单个单词“confetti”是英文或意大利文,否则你不会知道它是指那些在庆祝或加糖的杏仁中乱扔的纸片。)