Python字节对象打印EBCDIC十六进制\x40而非@的实现方法问询
嘿,我来帮你搞清楚这个问题!
你遇到的是Python字节对象默认打印行为导致的小困惑:当Python输出字节对象时,会自动把对应可打印ASCII字符的字节转换成对应的字符显示,而不是保留十六进制转义序列。比如\x40对应的ASCII字符是@,所以Python就直接显示@,而不是\x40——这是Python为了提升可读性设计的默认逻辑,但确实会在你需要查看原始十六进制转义形式时添堵。
比如你的测试代码如果是这样:
my_bytes = b'\x40' print(my_bytes)
输出自然就是b'@',和你看到的一致。
那怎么让它显示成\x40呢?你需要手动格式化每个字节的输出,而不是依赖默认打印行为,这里有两种实用方法:
方法1:遍历字节手动格式化
直接遍历字节对象里的每个字节,把它们格式化为\x开头的两位十六进制字符串:
my_bytes = b'\x40' # 生成纯转义格式的字符串 formatted = ''.join(f'\\x{byte:02x}' for byte in my_bytes) print(formatted) # 输出:\x40 # 如果想要保留b''的字节对象样式 formatted_with_bracket = f"b'{formatted}'" print(formatted_with_bracket) # 输出:b'\x40'
方法2:用binascii模块辅助(可选)
如果你习惯用binascii处理字节相关操作,也可以先把字节转成十六进制字符串,再拼接\x前缀:
import binascii my_bytes = b'\x40' hex_str = binascii.hexlify(my_bytes).decode('ascii') formatted = '\\x' + hex_str print(formatted) # 输出:\x40
这里要提一句:别用repr()函数,它虽然能返回对象的“官方表示”,但同样会优先显示可打印字符,所以repr(my_bytes)还是会输出b'@',达不到你的要求。
内容的提问来源于stack exchange,提问作者Michael Nolan
相关产品推荐
相关产品推荐

