Python int.to_bytes()转字节出现单字符意外结果是什么原因
Python
int.to_bytes() 输出单字符问题说明 核心结论
你看到的Z、!、L这类单字符不是转换错误,是Python bytes类型的内置显示规则导致的,转换结果的实际数值和你预期的十六进制结果完全一致。
具体规则说明
Python打印字节串(bytes对象)时,会对每个字节的值做判断,选择不同的显示形式:
- 如果字节值在0~32区间,属于ASCII不可打印控制字符,会显示为
\x加两位十六进制的转义格式,也就是你认为“正常”的形式 - 如果字节值在33~126区间,属于ASCII可打印字符,会直接显示对应的ASCII字符,不会用十六进制转义形式
- 如果字节值大于126,会根据具体编码规则显示为其他转义形式
示例对应关系
你给出的三个转换结果,和预期的十六进制值完全一一对应:
- 整数90转4字节大端序的最后一个字节值为
0x5A,对应ASCII表中的大写字符Z,所以显示为b'\x00\x00\x00Z',和你预期的b'\x00\x00\x00\x5A'是完全相同的字节串 - 整数33转4字节大端序的最后一个字节值为
0x21,对应ASCII表中的感叹号!,所以显示为b'\x00\x00\x00!' - 整数76转4字节大端序的最后一个字节值为
0x4C,对应ASCII表中的大写字符L,所以显示为b'\x00\x00\x00L'
验证方法
你可以运行以下代码确认结果一致性:
x = 90 y = 33 z = 76 # 直接比较to_bytes结果和你预期的十六进制字节串 print(x.to_bytes(4, 'big') == b'\x00\x00\x00\x5A') # 输出 True print(y.to_bytes(4, 'big') == b'\x00\x00\x00\x21') # 输出 True print(z.to_bytes(4, 'big') == b'\x00\x00\x00\x4C') # 输出 True # 如果需要查看全十六进制格式的原始值,用hex()方法即可 print(x.to_bytes(4, 'big').hex()) # 输出 0000005a
如果需要统一查看所有字节的十六进制表示,不要直接打印bytes对象,调用.hex()方法输出即可,不要被显示形式误导,字节的实际存储值没有任何偏差。
内容的提问来源于stack exchange,提问作者Jouenshin
相关产品推荐
相关产品推荐

