我正在尝试使用
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 3.5+ 中,将字符串编码为字节并使用
hex()
方法,返回一个字符串。
s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'
可以选择将字符串转换回字节:
b = bytes(s, "utf-8")
b
# b'68656c6c6f'
在 Python 3.5 及更高版本中执行此操作的最简单方法是:
>>> 'halo'.encode().hex()
'68616c6f'
如果您使用 utf-8
字符手动将字符串输入 Python 解释器,则可以通过在字符串前键入
b
来更快地完成操作:
>>> b'halo'.hex()
'68616c6f'
Python 2.x 中的等效项:
>>> 'halo'.encode('hex')
'68616c6f'
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中,所有字符串都是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。
类型:内置函数或方法
另一种方法:
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 进行测试。
>>> "hello".encode().hex()
'68656c6c6f'
>>> b"hello".hex()
'68656c6c6f'
>>> bytes.fromhex("68656c6c6f")
b'hello'
>>> bytes.fromhex("68656c6c6f").decode()
'hello'