Python 3.1.1字符串转换为十六进制


70

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



28

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

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

(可选)将字符串转换回字节:

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

2
这是针对Python 3字符串变量执行此操作的方法。这里的许多答案都是关于常量的。实用的代码很少如此。
加里·特尔基亚

1
如果您想使用> = Python 3.5,则强调hex()
ner0

26

您已经有了一些不错的答案,但是我想您也可能会对一些背景感兴趣。

首先,您缺少引号。它应该是:

"hello".encode("hex")

其次,该编解码器尚未移植到Python 3.1。看这里。看来他们尚未决定是否将这些编解码器包含在Python 3中或以其他方式实现。

如果您查看该错误附带的差异文件,则可以看到建议的实现方法:

import binascii
output = binascii.b2a_hex(input)

23

顺便说一句,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'

希望能帮助到你。:)


Binascii也比其他方法更快。刚刚用timeit测试。
西蒙·斯坦伯格

如果字符串是常规Python 3字符串,而不是二进制或常量,那么如何将字符串转换为十六进制?
加里·特尔基亚

11

在Python 3.5及更高版本中,最简单的方法是:

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

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

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

在Python 2.x中等效:

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

谢谢@ ner0的重要评论!
simhumileco

1
别担心。如果要求v3.4或更低版本,则将执行以下操作:from binascii import hexlify str(hexlify(bytes('halo', encoding = 'utf-8')), 'ascii')
ner0

9

在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




2

还有另一种方法:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.