在Python 3中将字节转换为十六进制字符串的正确方法是什么?在Python 3中将字节转换为十六进制字符串的正确方法是什么?
我看到一个bytes.hex
方法的索赔,bytes.decode
编解码器,并试图other可能的功能最小的惊讶,无济于事。我只是想要我的字节为十六进制!
在Python 3中将字节转换为十六进制字符串的正确方法是什么?在Python 3中将字节转换为十六进制字符串的正确方法是什么?
我看到一个bytes.hex
方法的索赔,bytes.decode
编解码器,并试图other可能的功能最小的惊讶,无济于事。我只是想要我的字节为十六进制!
使用binascii
模块:
>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'
看到这个答案: Python 3.1.1 string to hex
这很好。令人难以置信的是,你可以使用bytes.fromhex(hex_str)将hex转换为字节,但不能使用bytes.tohex()将字节转换为十六进制 - 这是什么理由? – nagylzs
我猜字节和十六进制之间的关系不是任何一个的属性(它不回答为什么fromhex在那里)。看起来这不仅仅是一个疏忽,而是一个争论的话题:http://bugs.python.org/issue3532#msg70950。 问:使用bytes对象的tohex方法执行此任务会有什么不好吗? A:国际海事组织,是的,它会。它使代码复杂化,并将注意力从适当的数据转换方法(即函数 - 而不是方法)上吸引。 –
这是否真的回答了这个问题?它不会返回一个十六进制的'str',而是一个'bytes'。我知道OP似乎对答案似乎很满意,但将这个答案扩展为包含'.decode(“ascii”)'也可以将它转换为“字符串”更好。 – ecerulm
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不太一致,但对于压缩编解码器,它提供了更多的控制。
使用python 3.3:'LookupError:unknown encoding:hex' –
@JanusTroelsen:尝试['hex_codec'](http://stackoverflow.com/a/22465079/4279)。或者直接使用'binascii.hexlify(b'foo')' – jfs
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]
在Python 3.3中工作(so“hex_codec”,而不是“hex”)。
也许有趣的是,在Python 3.4中,“hex”或“hex_codec”可以正常工作。 –
方法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'
因为Python 3.5,这是终于不再尴尬:
>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'
和反向:
>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'
也适用于可变的bytearray
类型。
参考:https://docs.python.org/3/library/stdtypes.html#bytes.hex – minexew
如果要转换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'
“无果”?你得到了哪些具体的**问题或错误?请显示代码和错误。 –
可能的重复http://stackoverflow.com/questions/2340319/python-3-1-1-string-to-hex –