解码十六进制字符串给我垃圾

时间:2012-11-13 16:23:47

标签: python hex

我有一个十六进制字符串:

12104c06134e5709140f104f02521b0a0442020c4d070b184f4815541f0800484e1e0241061d064d540b0a020210194510164d4f3a005343004e430e1e1d0a524612171b0117001b0e45431c0c1d160a520d11744e19061a114d0e55174f084e543714050b174353541b48070e000e4d

如果你很好奇,我只想解码成可读文本(虽然这是一个加密问题,所以解码后的文本看起来仍然是无意义的,但非常无意义)。为此,我将上述消息保存到变量msg中。然后我执行了这个操作:

msg.decode('hex')

然而,当我打印这个值时,我会得到一些字符,一堆奇怪的正方形,以及多行分割的文本。发生了什么事?

1 个答案:

答案 0 :(得分:4)

听起来您认为某些ASCII数据存储在该十六进制字符串中。如果是这种情况,则十六进制字符串中的每两个字符代表一个ASCII字节的字节。如果是这种情况,你可以这样解码它:

>>> a = "12104c06134e5709140f104f02521b0a0442020c4d070b184f4815541f0800484e1e0241061d064d540b0a020210194510164d4f3a005343004e430e1e1d0a524612171b0117001b0e45431c0c1d160a520d11744e19061a114d0e55174f084e543714050b174353541b48070e000e4d"
>>> bytes = [a[i:i+2] for i in range(0,len(a),2)]
>>> s_decoded = [chr(int(c,16)) for c in bytes]
>>> ''.join(s_decoded)
'\x12\x10L\x06\x13NW\t\x14\x0f\x10O\x02R\x1b\n\x04B\x02\x0cM\x07\x0b\x18OH\x15T\x1f\x08\x00HN\x1e\x02A\x06\x1d\x06MT\x0b\n\x02\x02\x10\x19E\x10\x16MO:\x00SC\x00NC\x0e\x1e\x1d\nRF\x12\x17\x1b\x01\x17\x00\x1b\x0eEC\x1c\x0c\x1d\x16\nR\r\x11tN\x19\x06\x1a\x11M\x0eU\x17O\x08NT7\x14\x05\x0b\x17CST\x1bH\x07\x0e\x00\x0eM'

但是,正如您所看到的,大多数这些字符都是“不可打印”的字符(即它们的ASCII值不会编码某些人类可读的字符,如“A”或“d”)。以下是解码包含可打印ASCII字符的十六进制字符串的示例:

>>> a2 = "43616c6562"
>>> bytes2 = [a2[i:i+2] for i in range(0,len(a2),2)]
>>> bytes2
['43', '61', '6c', '65', '62']
>>> ''.join([chr(int(c,16)) for c in bytes2])
'Caleb'
>>>