在Python 3中将字节转换为hexstring的正确方法是什么?

在Python 3中将字节转换为hexstring的正确方法是什么?

我看到一个bytes.hex方法的声明, bytes.decode编解码器,并尝试了其他可能的function,最小的惊讶没有用。 我只是想要我的字节为hex!

使用binascii模块:

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

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

自从Python 3.5以来,这终于不再是尴尬的了:

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

并相反:

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

也适用于可变的bytearraytypes。

Python具有字节到字节的标准编解码器 ,可执行方便的转换,如引用可打印(适用于7位ascii),base64(适合字母数字),hex转义,gzip和bz2压缩。 在Python 2中,你可以这样做:

 b'foo'.encode('hex') 

在Python 3中, str.encode / bytes.decode严格用于字节转换。 相反,你可以做到这一点,它适用于Python 2和Python 3(反编译/解码/克 ):

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

从Python 3.4开始,有一个不太尴尬的select:

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

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

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

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

方法binascii.hexlify()bytes转换为表示asciihexstring的bytes 。 这意味着input中的每个字节都将被转换为两个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 

从hexstring"0a160a04"到可以回到带有binascii.unhexlify("0a160a04")bytes ,这会返回b'\n\x16\n\x04'

如果你想将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