【问题标题】:Decoding hex string gives me garbage [closed]解码十六进制字符串给我垃圾[关闭]
【发布时间】:2012-11-13 16:23:47
【问题描述】:

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

12104c06134e5709140f104f02521b0a0442020c4d070b184f4815541f0800484e1e0241061d064d540b0a020210194510164d4f3a005343004e430e1e1d0a524612171b0117001b0e45431c0c1d160a520d11744e19061a114d0e55174f084e543714050b174353541b48070e000e4d

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

msg.decode('hex')

但是,当我打印该值时,我得到了一些字符、一堆奇怪的方块,以及多行碎片化的文本。这是怎么回事?

【问题讨论】:

  • 你希望它打印什么?
  • 好吧,我对十六进制转换不够精通,无法准确表示我的期望,但基本上是一串英文字符和空格,一些大写一些小写。
  • 当我在这里转换你的十六进制 (string-functions.com/hex-string.aspx) 我得到和你一样的结果。十六进制不代表您认为的含义,或者您生成了不正确的十六进制字符串。
  • 虽然python挺强大的,但我觉得没有solve_crypto_riddle的功能。
  • 十六进制字符串中的许多值不会解码为 ASCII 或 utf-8 字符,因此如果打印出来,它将是不可读的非字符垃圾,解码后混合了一些常规字符。

标签: python hex


【解决方案1】:

听起来您认为某些ASCII 数据存储在该十六进制字符串中。如果是这种情况,十六进制字符串中的每 2 个字符代表 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'
>>> 

【讨论】:

  • 呃,为什么不直接写'43616c6562'.decode('hex')?
  • 这种方式对于实际发生的事情更加明确。
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多