Python中bytes字面量如何表示?为何b'5QUU'与十六进制转义bytes相等
Python bytes字面量表示规则与相关问题解答
1. bytes字面量的表示规则
Python的bytes字面量以b作为前缀标识,本质是0~255范围的字节序列,支持两种表示方式:
- 属于可打印ASCII范围(0x20~0x7E的可见字符,以及换行、制表符等可转义的ASCII控制符)的字节,可以直接写对应的字符表示
- 任意字节都可以用
\xHH格式的十六进制转义表示,其中HH是两位十六进制数,不管对应字节是否可打印都可以用这种形式
注意:bytes字面量中直接书写的字符只能属于ASCII范围,非ASCII字符无法直接写入,需要通过字符串编码或者十六进制转义的方式生成。
2. 为什么b'5QUU' == b'\x35\x51\x55\x55'返回True
把第二个字面量的十六进制转义逐个转成ASCII对应字符就能明白:
\x35的十进制值为53,对应ASCII字符'5'\x51的十进制值为81,对应ASCII大写字母'Q'\x55的十进制值为85,对应ASCII大写字母'U'
所以b'\x35\x51\x55\x55'本质就是b'5' + b'Q' + b'U' + b'U',和左边的b'5QUU'是完全相同的字节序列,只是写出来的形式不同,所以相等判断返回True。Python默认显示bytes时,只要字节对应可打印ASCII字符就会显示字符,否则才显示十六进制转义,这只是显示策略的区别,不影响字节本身的值。
3. 查看同一个bytes对象的多种表示形式
可以通过内置方法和简单的自定义逻辑得到不同形式的表示:
- 查看Python默认的混合表示:直接打印变量或者在交互环境输出变量即可
demo_b = b'5QUU\x00\xff' print(demo_b) # 输出:b'5QUU\x00\xff'
- 查看连续/分隔格式的十六进制字符串:使用
hex()方法
print(demo_b.hex()) # 输出无分隔的十六进制串:3551555500ff print(demo_b.hex(' ')) # 输出空格分隔的十六进制串:35 51 55 55 00 ff
- 查看每个字节的十进制整数值:直接转成list即可
print(list(demo_b)) # 输出:[53, 81, 85, 85, 0, 255]
- 强制所有字节都用
\x转义形式表示:自定义格式化拼接即可
full_hex_repr = "b'" + ''.join(f'\\x{byte:02x}' for byte in demo_b) + "'" print(full_hex_repr) # 输出:b'\x35\x51\x55\x55\x00\xff'
内容的提问来源于stack exchange,提问作者McXD
相关产品推荐
相关产品推荐

