【问题标题】:Python 3: Unable to convert ASCII String to HexadecimalPython 3:无法将 ASCII 字符串转换为十六进制
【发布时间】:2019-10-20 00:22:55
【问题描述】:

Python 版本:3.7.2
我需要将Øâþ ÿþ !Zk2ìm "Ï"À>q úÞ 之类的ASCII 字符串转换为十六进制,在本例中为d8 e2 02 12 02 fe 01 20 9b 10 20 20 03 ff 07 fe 20 20 21 5a 6b 32 ec 17 6d 20 0e 22 cf 22 c0 3e 71 20 02 20 03 fa de。我找到了几种在 Python 2 上执行此操作的解决方案,但是我在 Python 3 上找不到任何执行此操作的方法。

总结一下:意图行为是 ASCII 到 HEX,如下所示:
Øâþ ÿþ !Zk2ìm "Ï"À>q úÞ TO d8 e2 02 12 02 fe 01 20 9b 10 20 20 03 ff 07 fe 20 20 21 5a 6b 32 ec 17 6d 20 0e 22 cf 22 c0 3e 71 20 02 20 03 fa de

我什至检查了https://www.rapidtables.com/convert/number/ascii-to-hex.html 并发现它有效,但我无法在 Python 3 中实现它。

【问题讨论】:

标签: python-3.x hex ascii


【解决方案1】:

您可以使用代码:

print(*[hex(ord(letter))[2:] for letter in 'Øâþ   ÿþ  !Zk2ìm "Ï"À>q  úÞ'])

给出以下输出:

d8 e2 fe 20 10 20 20 ff fe 20 20 21 5a 6b 32 ec 6d 20 e 22 cf 22 c0 3e 71 20 20 fa de

ord() - 获取ASCII码, hex() - 从 int 中获取十六进制, [2:] - 在每个数字中省略 0x

编辑

稍微修改的版本(得到0e而不是e):

string = 'Øâþ   ÿþ  !Zk2ìm "Ï"À>q  úÞ'
print(*['{:02x}'.format(ord(letter)) for letter in string])

【讨论】:

  • 感谢 Poolka,但在 6d 20 e 22 cf 子段中,您在 1 个字节中有一个单独的 e 字符,这就是我尝试从每个字节中省略起始 2 个字符时遇到的问题。 e 是单个十六进制字符,应该占用半个字节/4 位,而不是当前占用的 8 位
  • @HarshitJindal e0e 我猜。 hex() 函数省略了前导零。此外e 是非常合法的十六进制数字。如果需要,您可以添加前导零。
  • 非常感谢。我不知道我尝试了多少查找它,但只找到了 Python 2 的答案或输出具有非十六进制字符的答案以及>! @Error - Syntactical Remorse 的答案。您能否解释一下为什么该解决方案会导致十六进制输出中出现非十六进制字符?
  • @HarshitJindal @Error 的答案 - 句法自责非常相似。不同之处在于另一种表示形式 - bytearray 而不是纯字符串。
  • @HarshitJindal 添加了略微修改的版本。遵循错误 - 语法悔恨的建议。似乎工作得很好。
【解决方案2】:

使用ord():

s = 'Øâþ   ÿþ  !Zk2ìm "Ï"À>q  úÞ'
bytes = bytearray(ord(char) for char in s)
print(bytes)

输出:

bytearray(b'\xd8\xe2\xfe \x10  \xff\xfe  !Zk2\xecm \x0e"\xcf"\xc0>q  \xfa\xde')

话虽如此,我无法完全匹配您的输出,因为您复制并粘贴了垃圾字符:

print(''.join(chr(char) for char in bytes)) # Øâþ   ÿþ  !Zk2ìm "Ï"À>q  úÞ

【讨论】:

  • 我能够得到这个输出,但是这个表单不是叫做 hex-ascii 吗?我希望我的输出是普通的十六进制,数据中没有任何 ascii 字符。查看我在问题中添加的网站链接。我想要那种类型的输出
猜你喜欢
  • 1970-01-01
  • 2014-11-16
  • 2011-11-21
  • 2017-08-25
  • 2015-05-22
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多