2011-07-08 27 views
83

在Python 3中将字节转换为十六进制字符串的正确方法是什么?在Python 3中将字节转换为十六进制字符串的正确方法是什么?

我看到一个bytes.hex方法的索赔,bytes.decode编解码器,并试图other可能的功能最小的惊讶,无济于事。我只是想要我的字节为十六进制!

+0

“无果”?你得到了哪些具体的**问题或错误?请显示代码和错误。 –

+0

可能的重复http://stackoverflow.com/questions/2340319/python-3-1-1-string-to-hex –

回答

75

使用binascii模块:

>>> import binascii 
>>> binascii.hexlify('foo'.encode('utf8')) 
b'666f6f' 
>>> binascii.unhexlify(_).decode('utf8') 
'foo' 

看到这个答案: Python 3.1.1 string to hex

+6

这很好。令人难以置信的是,你可以使用bytes.fromhex(hex_str)将hex转换为字节,但不能使用bytes.tohex()将字节转换为十六进制 - 这是什么理由? – nagylzs

+1

我猜字节和十六进制之间的关系不是任何一个的属性(它不回答为什么fromhex在那里)。看起来这不仅仅是一个疏忽,而是一个争论的话题:http://bugs.python.org/issue3532#msg70950。 问:使用bytes对象的tohex方法执行此任务会有什么不好吗? A:国际海事组织,是的,它会。它使代码复杂化,并将注意力从适当的数据转换方法(即函数 - 而不是方法)上吸引。 –

+2

这是否真的回答了这个问题?它不会返回一个十六进制的'str',而是一个'bytes'。我知道OP似乎对答案似乎很满意,但将这个答案扩展为包含'.decode(“ascii”)'也可以将它转换为“字符串”更好。 – ecerulm

27

Python有个字节到字节standard codecs执行方便的转换像引用可打印(适合7位ASCII)的base64 (适合字母数字),十六进制转义,gzip和bz2压缩。在Python 2,你可以这样做:

b'foo'.encode('hex') 

在Python 3,str.encode/bytes.decode严格的字节< - >海峡转换。相反,你可以做到这一点,其中不同的Python 2和Python 3作品(S /编码/解码/ G的倒数):

import codecs 
codecs.getencoder('hex')(b'foo')[0] 

与Python 3.4开始,有一个不太尴尬的选择:

codecs.encode(b'foo', 'hex') 

这些misc编解码器也可以在它们自己的模块(base64,zlib,bz2,uu,quopri,binascii)中访问; API不太一致,但对于压缩编解码器,它提供了更多的控制。

+1

使用python 3.3:'LookupError:unknown encoding:hex' –

+0

@JanusTroelsen:尝试['hex_codec'](http://stackoverflow.com/a/22465079/4279)。或者直接使用'binascii.hexlify(b'foo')' – jfs

7
import codecs 
codecs.getencoder('hex_codec')(b'foo')[0] 

在Python 3.3中工作(so“hex_codec”,而不是“hex”)。

+0

也许有趣的是,在Python 3.4中,“hex”或“hex_codec”可以正常工作。 –

3

方法binascii.hexlify()bytes转换为表示ascii十六进制字符串的bytes。这意味着输入中的每个字节都将转换为两个ASCII字符。如果你想真的str出来,那么你可以.decode("ascii")的结果。

我收录了一个说明它的片段。

import binascii 

with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls' 
    in_bytes = f.read() 
    print(in_bytes) # b'\n\x16\n\x04' 
    hex_bytes = binascii.hexlify(in_bytes) 
    print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes 
    hex_str = hex_bytes.decode("ascii") 
    print(hex_str) # 0a160a04 

从十六进制字符串"0a160a04"到可以binascii.unhexlify("0a160a04")这回来到bytes还给b'\n\x16\n\x04'

118

因为Python 3.5,这是终于不再尴尬:

>>> b'\xde\xad\xbe\xef'.hex() 
'deadbeef' 

和反向:

>>> bytes.fromhex('deadbeef') 
b'\xde\xad\xbe\xef' 

也适用于可变的bytearray类型。

+1

参考:https://docs.python.org/3/library/stdtypes.html#bytes.hex – minexew

0

如果要转换B'\ x61的97或 '0x61',你可以试试这个:

[python3.5] 
>>>from struct import * 
>>>temp=unpack('B',b'\x61')[0] ## convert bytes to unsigned int 
97 
>>>hex(temp) ##convert int to string which is hexadecimal expression 
'0x61' 

参考:https://docs.python.org/3.5/library/struct.html

相关问题