Python 3 字符串转十六进制

问题描述 投票:0回答:10

我正在尝试使用

str.encode()
,但我明白了

>>> "hello".encode(hex)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be string, not builtin_function_or_method

>>> "hello".encode("hex")
LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
python string python-3.x hex
10个回答
104
投票

hex
编解码器已在 3.x 中被删除。使用
binascii
代替:

>>> binascii.hexlify(b'hello')
b'68656c6c6f'

50
投票

在 Python 3.5+ 中,将字符串编码为字节并使用

hex()
方法,返回一个字符串。

s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'

可以选择将字符串转换回字节:

b = bytes(s, "utf-8")
b
# b'68656c6c6f'

26
投票

您已经得到了一些很好的答案,但我认为您可能也对一些背景感兴趣。

首先你错过了引号。应该是:

"hello".encode("hex")

其次,这个编解码器还没有移植到Python 3.1。请参阅此处。看来他们还没有决定这些编解码器是否应该包含在 Python 3 中或以不同的方式实现。

如果您查看该错误附带的 diff 文件,您可以看到建议的实现方法:

import binascii
output = binascii.b2a_hex(input)

26
投票

在 Python 3.5 及更高版本中执行此操作的最简单方法是:

>>> 'halo'.encode().hex()
'68616c6f'

如果您使用 utf-8

 字符手动将字符串输入 Python 解释器
,则可以通过在字符串前键入
b
来更快地完成操作:

>>> b'halo'.hex()
'68616c6f'

Python 2.x 中的等效项:

>>> 'halo'.encode('hex')
'68616c6f'

24
投票

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'

希望有帮助。 :)


10
投票

在Python 3中,所有字符串都是unicode。通常,如果将 unicode 对象编码为字符串,则使用

.encode('TEXT_ENCODING')
,因为
hex
不是文本编码,因此应该使用
codecs.encode()
来处理任意编解码器。例如:

>>>> "hello".encode('hex')
LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>>> import codecs
>>>> codecs.encode(b"hello", 'hex')
b'68656c6c6f'

再次强调,由于“hello”是unicode,因此在编码为十六进制之前,您需要将其指示为字节字符串。这可能更符合您使用

encode
方法的原始方法。

binascii.hexlify
codecs.encode
之间的区别如下:

  • binascii.hexlify

    二进制数据的十六进制表示。

    返回值是一个bytes对象。

    类型:内置函数或方法

  • 编解码器.encode

    编码(obj,[编码[,错误]])->对象

    使用注册用于编码的编解码器对 obj 进行编码。编码默认值 为默认编码。可能会给出错误来设置不同的错误 处理方案。默认值为“严格”,这意味着会出现编码错误 值错误。其他可能的值是“忽略”、“替换”和 'xmlcharrefreplace' 以及任何其他注册名称 codecs.register_error 可以处理 ValueErrors。

    类型:内置函数或方法


8
投票

base64.b16encode
base64.b16decode
将字节与十六进制相互转换,并适用于所有 Python 版本。 编解码器方法也有效,但在 Python 3 中不太简单。



2
投票

另一种方法:

s = 'hello'

h = ''.join([hex(ord(i)) for i in s]);

# outputs: '0x680x650x6c0x6c0x6f'

这基本上将字符串拆分为字符,通过

hex(ord(char))
进行转换,然后将字符重新连接在一起。如果您想要不带前缀
0x
的结果,请执行以下操作:

h = ''.join([str(hex(ord(i)))[2:4] for i in s]);

# outputs: '68656c6c6f'

使用 Python 3.5.3 进行测试。


0
投票

str 转十六进制:

>>> "hello".encode().hex()
'68656c6c6f'

字节转十六进制:

>>> b"hello".hex()
'68656c6c6f'

十六进制字节:

>>> bytes.fromhex("68656c6c6f")
b'hello'

来自十六进制的str:

>>> bytes.fromhex("68656c6c6f").decode()
'hello'
© www.soinside.com 2019 - 2024. All rights reserved.