Python 3.1.1字符串到十六进制

时间:2010-02-26 08:27:09

标签: python string python-3.x hex

我正在尝试使用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

我尝试了很多变种,它们似乎都在Python 2.5.2中工作,所以我需要做些什么才能让它们在Python 3.1中工作?

9 个答案:

答案 0 :(得分:74)

hex编解码器已被放入3.x.请改用binascii

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

答案 1 :(得分:21)

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

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

"hello".encode("hex")

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

如果您查看该bug附带的diff file,您可以看到建议的实施方法:

import binascii
output = binascii.b2a_hex(input)

答案 2 :(得分:17)

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'

希望它有所帮助。 :)

答案 3 :(得分:11)

在Python 3中,将字符串编码为字节并使用hex()方法,返回一个字符串。

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

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

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

答案 4 :(得分:7)

在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

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

    返回值是一个字节对象。

    输入:builtin_function_or_method

  • <强> codecs.encode

    encode(obj,[encoding [,errors]]) - &gt;对象

    使用为编码注册的编解码器对obj进行编码。编码默认值 到默认编码。可能会给出错误以设置不同的错误 处理方案。默认为'strict',表示编码错误会增加 一个ValueError。其他可能的值是'ignore','replace'和 'xmlcharrefreplace'以及注册的任何其他名称 可以处理ValueErrors的codecs.register_error。

    输入:builtin_function_or_method

答案 5 :(得分:6)

base64.b16encodebase64.b16decode将字节转换为十六进制和从十六进制转换,并适用于所有Python版本。 codecs approach也可以,但在Python 3中不太直接。

答案 6 :(得分:3)

答案 7 :(得分:3)

在Python 3.x中最简单的方法是:

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

如果您使用utf-8字符在Python解释器中手动输入字符串,则可以通过在字符串之前输入b来更快地完成此操作:

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

在Python 2.x中等效:

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

答案 8 :(得分:1)

又一种方法:

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进行测试。