Python 将字节打印为十六进制

Python 将字节打印为十六进制,python,python-3.x,Python,Python 3.x,我想把字符串编码成字节 为了转换为是,我使用了byte.fromhex() 但它显示了一些字符 如何将其显示为十六进制,如下所示 b't\x03\x078E' => '\x74\x03\x07\x38\x45' 无法更改Pythonrepr。如果你想做这样的事情,你需要自己去做字节对象正在尝试最小化溢出,而不是格式化输出 如果您想这样打印,可以执行以下操作: from itertools import repeat hexstring = '7403073845' # Makes t

我想把字符串编码成字节

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

但它显示了一些字符

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

b't\x03\x078E' => '\x74\x03\x07\x38\x45'

无法更改Python
repr
。如果你想做这样的事情,你需要自己去做<代码>字节对象正在尝试最小化溢出,而不是格式化输出

如果您想这样打印,可以执行以下操作:

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='')
输出完全符合您的要求:

'\x74\x03\x07\x38\x45'
我想把字符串编码成字节

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

>>> b't' == b'\x74'
True
将字节打印为十六进制

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

>>> b't\x03\x078E'.hex()
'7403073845'
在较旧的Python版本上,可以使用
binascii.hexlify()

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


您可以覆盖sys.displayhook,以更改REPL.@J.F.Sebastian:Eew中字节的显示方式。。。每天学习一些新的和可怕的东西。别误会我,那很酷。但是,由于在完全不同的地方定义了代码,用其他东西取代正常的
repr
的想法让我感到害怕;当你期待一件事,却得到了完全不同的东西时,你会非常困惑。你给了我一些有趣的想法,让我用修改过的
PYTHONSTARTUP
文件来恶作剧二进制数据应该显示为二进制(hex-repr)并不是一个奇怪的想法。我知道许多协议自由地混合了ascii文本和二进制数据,并且Python2遗留版本中的文本和二进制数据通常表示为相同的
str
类型。如果从零开始设计的话,
repr(b'\x74')
应该是什么是有争议的(为什么你认为
“b't'”
内部的图像数据比
“b'\x74'”
好?)@J.F.Sebastian:“Eew”并不是想用另一种方法来做
repr
。正是在代码完全控制REPL displayback的想法下,您期望的正常行为(查看
repr
)被替换为“displayhook发生了什么”(没有明显的迹象表明它正在发生;错误可能会悄悄地丢弃/损坏数据)。我同意在纯转义码和部分ASCII码之间的选择大多是任意的(尽管在二进制数据实际上是ASCII码的情况下,坚持使用部分ASCII码更容易阅读)。@J.F.Sebastian:实际上,忽略我想说的,读一下这篇文章(以及第一段中链接的相关文章),想知道为什么它困扰着我。用全局解决方案解决局部问题(我希望这些特定的
字节
对象以不同的方式显示)令人担忧(我将完全控制所有对象的回显机制)。
>>> b't\x03\x078E'.hex()
'7403073845'
>>> import binascii
>>> binascii.hexlify(b't\x03\x078E').decode('ascii')
'7403073845'
>>> print(''.join(['\\x%02x' % b for b in b't\x03\x078E']))
\x74\x03\x07\x38\x45