我正在尝试使用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中工作?
答案 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.b16encode
和base64.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进行测试。