我正在尝试使用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中工作?
Answers:
顺便说一句,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'
希望能帮助到你。:)
在Python 3.5及更高版本中,最简单的方法是:
>>> 'halo'.encode().hex()
'68616c6f'
如果您使用utf-8
字符在Python解释器中手动输入字符串,则可以通过b
在字符串之前输入以下命令来更快地完成输入:
>>> b'halo'.hex()
'68616c6f'
在Python 2.x中等效:
>>> 'halo'.encode('hex')
'68616c6f'
from binascii import hexlify str(hexlify(bytes('halo', encoding = 'utf-8')), 'ascii')
在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
如下:
己二酸
二进制数据的十六进制表示。
返回值是一个字节对象。
类型:builtin_function_or_method
codecs.encode
encode(obj,[encoding [,errors]])->对象
使用注册用于编码的编解码器对obj进行编码。编码默认为默认编码。可以设置错误以设置不同的错误处理方案。默认值为“严格”,表示编码错误会引发ValueError。其他可能的值是'ignore','replace'和'xmlcharrefreplace'以及在codecs.register_error中注册并可以处理ValueErrors的任何其他名称。
类型:builtin_function_or_method
base64.b16encode
并base64.b16decode
在十六进制之间来回转换字节,并且可以在所有Python版本中使用。该编解码器的接近也可以,但是在Python 3那么简单。
>>> import base64 >>> key = base64.b16encode(b'0123456789abcdef') >>> base64.b16decode(key) '0123456789abcdef'
使用hexlify- http: //epydoc.sourceforge.net/stdlib/binascii-module.html
还有另一种方法:
s = 'hello'
h = ''.join([hex(ord(i)) for i in s]);
# outputs: '0x680x650x6c0x6c0x6f'
这基本上将字符串拆分为char,通过进行转换hex(ord(char))
,并将char重新连接在一起。如果您想要不带前缀的结果,0x
请执行以下操作:
h = ''.join([str(hex(ord(i)))[2:4] for i in s]);
# outputs: '68656c6c6f'
经过Python 3.5.3测试。