【问题标题】:Convert from ASCII to Hex in Python在 Python 中从 ASCII 转换为十六进制
【发布时间】:2021-04-21 21:28:03
【问题描述】:

我正在尝试使用 python 将带有特殊字符的字符串从 ASCII 转换为十六进制,但我似乎没有得到正确的值,并注意到每当我尝试转换字符串时它都可以正常工作没有特殊字符。所以基本上这就是我正在做的事情:

import binascii

s = "D`Cزف³›"
s_bytes = str.encode(s)
hex_value = str(binascii.hexlify(s_bytes),'ascii')
print (hex_value)

输出

446043d8b2d981c2b316e280ba

输出应该在哪里(使用在线转换器https://www.rapidtables.com/convert/number/ascii-to-hex.html):

446043632641b3203a

【问题讨论】:

  • 将该站点上的字符编码更改为 UTF-8,您会看到它匹配。如果您的输入实际上不是 ASCII,您就不能期望进行合理的转换。
  • 你输入的字符串不是ASCII
  • 注意 s 不是一个纯 ASCII 字符串,所以 ASCII 到 Hex 是用词不当。 encode 默认使用 UTF-8,因此您将 UTF-8 编码的字节字符串的字节作为十六进制值。
  • hex_value = ''.join([f'{ord(c):x}' for c in s]) 会得到你想要的,但这是你需要的吗? ???由于某些字符有 2 位、3 位和 4 位数字值,您将如何将其转换回来。
  • 似乎我们正在解决X-Y Problem。你为什么要这个?你真正想解决什么问题?

标签: python hex ascii


【解决方案1】:

str.encode(s) 默认为utf8 编码,它不会为您提供获得所需输出所需的字节值。您想要的值只是作为十六进制值的 Unicode 序数,因此获取序数,转换为十六进制并将它们全部连接在一起:

s = 'D`Cزف³›'
h = ''.join([f'{ord(c):x}' for c in s])
print(h)
446043632641b3203a

请注意,Unicode 序数可以是 1-6 位十六进制数字,因此没有简单的方法来反转该过程,因为您没有数字间距。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2017-08-28
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    相关资源
    最近更新 更多