将字节打印为十六进制

use*_*542 9 python python-3.x

我想将字符串编码为字节。

为了转换为再见,我使用了byte.fromhex()

>>> byte.fromhex('7403073845')
b't\x03\x078E'
Run Code Online (Sandbox Code Playgroud)

但它显示了一些字符。

如何将其显示为如下所示的十六进制?

b't\x03\x078E' => '\x74\x03\x07\x38\x45'
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 7

我想将字符串编码为字节。

bytes.fromhex()已经将您的十六进制字符串转换为字节。不要混淆对象及其文本表示形式——REPL 使用sys.displayhook它来repr()将ascii 可打印范围中的字节显示为相应的字符,但它不会以任何方式影响该值:

>>> b't' == b'\x74'
True
Run Code Online (Sandbox Code Playgroud)

将字节打印为十六进制

要将字节转换回十六进制字符串,您可以使用bytes.hexPython 3.5 以来的方法:

>>> b't\x03\x078E'.hex()
'7403073845'
Run Code Online (Sandbox Code Playgroud)

在较旧的 Python 版本上,您可以使用binascii.hexlify()

>>> import binascii
>>> binascii.hexlify(b't\x03\x078E').decode('ascii')
'7403073845'
Run Code Online (Sandbox Code Playgroud)

如何将其显示为如下所示的十六进制?b't\x03\x078E' => '\x74\x03\x07\x38\x45'

>>> print(''.join(['\\x%02x' % b for b in b't\x03\x078E']))
\x74\x03\x07\x38\x45
Run Code Online (Sandbox Code Playgroud)


Sha*_*ger 2

Pythonrepr无法更改。如果你想做这样的事情,你需要自己做;bytes对象正在尝试最大限度地减少溢出,而不是为您格式化输出。

如果你想像这样打印它,你可以这样做:

from itertools import repeat

hexstring = '7403073845'

# Makes the individual \x## strings using iter reuse trick to pair up
# hex characters, and prefixing with \x as it goes
escapecodes = map(''.join, zip(repeat(r'\x'), *[iter(hexstring)]*2))

# Print them all with quotes around them (or omit the quotes, your choice)
print("'", *escapecodes, "'", sep='')
Run Code Online (Sandbox Code Playgroud)

输出完全按照您的要求:

'\x74\x03\x07\x38\x45'
Run Code Online (Sandbox Code Playgroud)