这些符号在“字节”类型中代表什么?

3

所以,我有一个以字节格式表示的单个字节,看起来像这样:

b'\xFF'

很容易理解,单个字节是在'\x'后面的两个符号(0-F)。

但有时模式不匹配,'\x'后面包含超过两个符号。

例如,如果我使用secrets.token_bytes(),可能会得到以下内容:

>>> import secrets
>>> secrets.token_bytes(32)
b't\xbcJ\xf0'

或者使用 hashlib 模块:

>>> import hashlib
>>> hashlib.sha256('abc'.encode()).digest()
b'\xbax\x16\xbf\x8f\x01\xcf\xeaAA@\xde]\xae"#\xb0\x03a\xa3\x96\x17z\x9c\xb4\x10\xffa\xf2\x00\x15\xad'

那么,请问有人能解释一下这些额外符号的作用以及它们是如何生成的吗? 谢谢!

2
这只是Python用二进制内容表示字符串中“不可打印”字符的方式。所有\xhh字符都是十六进制表示法。其他所有字符都是ASCII字符的字面值。很容易在许多ascii字符中发现偶尔出现的十六进制字符,但像你在“hashlib digest”中展示的那样,以反向方式更难。 - quamrana
1个回答

4
这是 Python 打印字节字符串的一种特殊方式。如果字节值是可打印的 ASCII 字符之一,它将打印该字符;否则,它将打印十六进制转义符。你可以通过显示 bytes(range(0x100)) 来进行可视化展示。
为了获得一个始终使用十六进制转义符的字符串,你需要自己构建它。
print(''.join(f'\\x{i:02x}' for i in bytes(range(0x100))))

非常感谢!实际上,它们被存储为模式 '\xNN',其中 N 为 0-f,但是如果您尝试打印它们,Python 将使用特定的 ASCII 符号替换一些匹配的字节,是吗? 此外,有没有一种方法可以表示“bytes”对象而不进行此替换? - numo_721
2
还有Python字节对象的hex()函数,它打印十六进制值(不带'\x')。例如:bytes(range(0x100)).hex() - hexahedronest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接