如何在 Python 3.2 或更高版本中使用“十六进制”编码?
Posted
技术标签:
【中文标题】如何在 Python 3.2 或更高版本中使用“十六进制”编码?【英文标题】:How to use the 'hex' encoding in Python 3.2 or higher? 【发布时间】:2012-10-06 16:55:26 【问题描述】:在 Python 2 中,要获取字符串中十六进制数字的字符串表示形式,您可以这样做
>>> '\x12\x34\x56\x78'.encode('hex')
'12345678'
在 Python 3 中,这不再起作用(在 Python 3.2 和 3.3 上测试):
>>> '\x12\x34\x56\x78'.encode('hex')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: unknown encoding: hex
在 SO 上至少有 one answer 提到 hex
编解码器已在 Python 3 中删除。但是,according to the docs 在 Python 3.2 中被重新引入,作为“字节到字节”映射”。
但是,我不知道如何让这些“字节到字节的映射”起作用:
>>> b'\x12'.encode('hex')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'
而且文档也没有提到这一点(至少不是我看过的地方)。我一定错过了一些简单的东西,但我看不到它是什么。
【问题讨论】:
看到这个答案:***.com/a/2340358/1298523 我反对将其作为骗子关闭。这个问题专门针对 Python 3.2,其中hex
编解码器正式回归(但更难找到)。链接的问题是关于 Python 3.1。
【参考方案1】:
您需要通过codecs
模块和hex_codec
编解码器(或其hex
别名,如果可用*):
codecs.encode(b'\x12', 'hex_codec')
* 来自文档:“3.4 版更改:恢复二进制转换的别名”.
【讨论】:
你不是说codecs.encode(b'\x12', 'hex_codec')
吗?使用'hex'
我只会得到LookupError: unknown encoding: hex
文档说hex
是 3.2 中的别名,但我的 3.2.3 安装有同样的错误。
虽然我找不到对错误修复的引用,但看起来 hex
从 3.4 开始又可以工作了。
谢谢!你拯救了我的一天:)【参考方案2】:
使用binascii.hexlify()
的另一种方式:
>>> import binascii
>>> binascii.hexlify(b'\x12\x34\x56\x78')
b'12345678'
【讨论】:
所以你看了一下所谓的骗子,是吗? :) 不,我通常是这样做的:)【参考方案3】:使用base64.b16encode()
:
>>> import base64
>>> base64.b16encode(b'\x12\x34\x56\x78')
b'12345678'
【讨论】:
【参考方案4】:binascii
方法比较简单:
>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'
【讨论】:
str(x,'ascii')
拼写更好x.decode('ascii')
binascii
对于任何关心的人来说似乎也更快。以上是关于如何在 Python 3.2 或更高版本中使用“十六进制”编码?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 xCode 4 或更高版本中添加或连接两个项目,例如一个项目
如何使使用旧 Java 版本开发的应用程序在 jdk 9 或更高版本上运行? [复制]
如何在 api 17 或更高版本中使 android seekbar 全宽?