如何让CPython始终以\x格式显示字节的十六进制值
让CPython始终以\x十六进制格式显示所有字节的方法
我太懂这种别扭的感觉了——明明字节数据是对的,但CPython偏要把那些对应可打印ASCII字符的字节换成字符显示,比如0x70变成'p'、0x0D变成'\r',导致输出格式不统一,看着特别难受。
其实解决方法很简单,我们可以自己实现一个格式化函数,强制把每个字节都转换成\xHH的十六进制格式:
基础实现:输出纯十六进制格式字符串
def format_bytes_to_full_hex(byte_obj): # 遍历每个字节,格式化为\x开头的两位十六进制字符串 return ''.join(f'\\x{byte:02x}' for byte in byte_obj)
用法演示
假设你的原始数值是a = 0xd8cdb78070b4c55a818665aa0d02dfda,转换后使用这个函数:
a = 0xd8cdb78070b4c55a818665aa0d02dfda byte_data = a.to_bytes(16, "big") print(format_bytes_to_full_hex(byte_data))
输出会是统一的\x格式:
\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a\x81\x86\x65\xaa\x0d\x02\xdf\xda
进阶:模拟Python字节字面量格式
如果你希望输出更贴近原生字节对象的显示风格(带b'前缀和结尾引号),可以修改函数:
def format_bytes_as_literal(byte_obj): hex_parts = ''.join(f'\\x{byte:02x}' for byte in byte_obj) return f"b'{hex_parts}'"
调用后输出:
b'\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a\x81\x86\x65\xaa\x0d\x02\xdf\xda'
验证数据正确性
不用担心这个格式化会改变字节数据本身,你可以像之前一样验证:
# 把格式化后的字符串转回字节对象(处理转义字符) formatted_str = format_bytes_to_full_hex(byte_data) restored_bytes = bytes(formatted_str.encode().decode('unicode-escape'), 'latin-1') # 转回去验证数值一致性 assert hex(int.from_bytes(restored_bytes, "big")) == hex(a)
这样就能保证显示格式完全符合你的需求,同时字节数据的准确性不受影响。
内容的提问来源于stack exchange,提问作者Joachim Strömbergson
相关产品推荐
相关产品推荐

