Python 3.1.1string到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中工作?
hex
编解码器已经被3.x. 改用binascii
:
>>> binascii.hexlify(b'hello') b'68656c6c6f'
你已经有了一些很好的答案,但是我认为你也可能对这个背景有点兴趣。
首先,你错过了报价。 它应该是:
"hello".encode("hex")
其次,这个编解码器还没有被移植到Python 3.1。 看到这里 。 看来,他们还没有决定这些编解码器是否应该包含在Python 3中,或者以不同的方式实现。
如果您查看附加到该错误的diff文件 ,您可以看到实现它的build议方法:
import binascii output = binascii.b2a_hex(input)
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'
希望能帮助到你。 🙂
base64.b16encode
和base64.b16decode
将字节转换为hex数据,并且可以跨越所有Python版本。 编解码器的方法也可以,但在Python 3中并不那么简单。
在Python 3中,所有string都是unicode。 通常,如果将unicode对象编码为string,则使用.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,所以在编码为hex之前,您需要将其指定为一个字节string。 这可能会更符合您使用encode
方法的原始方法。
binascii.hexlify
和codecs.encode
的区别如下:
-
binascii.hexlify
二进制数据的hex表示。
返回值是一个字节对象。
types:builtin_function_or_method
-
codecs.encode
encode(obj,[encoding [,errors]]) – > object
使用为编码注册的编解码器编码obj。 编码默认为默认编码。 可能会给出错误来设置不同的error handlingscheme。 缺省值是'strict',这意味着编码错误会引发ValueError。 其他可能的值是'ignore','replace'和'xmlcharrefreplace'以及其他可以处理ValueErrors的用codecs.register_error注册的名字。
types:builtin_function_or_method
在Python 3中,将string编码为字节,并使用hex()
方法返回一个string。
s = "hello".encode("utf-8").hex() s # '68656c6c6f'
可以select将string转换回字节:
b = bytes(s, "utf-8") b # b'68656c6c6f'