Python struct.pack输出结果的三类技术疑问解析
Python struct.pack 输出疑问解答
示例代码
import struct field_size_4_bytes = 1234 field_size_2_bytes = 2 field_size_16_bytes = bytes("1234567812345678", 'utf-8') res = struct.pack('<lh16s', field_size_4_bytes , field_size_2_bytes , field_size_16_bytes ) print(res)
运行输出
b'\xd2\x04\x00\x00\x02\x001234567812345678'
疑问解答
1. 为何字符串原样输出,数字1234显示为\xd2\x04\x00\x00?该二进制序列与1234有何关联?
- 字符串字段用
16s格式符打包,规则是直接保留字节串的原始内容,所以原样输出。 - 数字1234用
l格式符(4字节长整型)打包,且格式字符串开头的<指定了小端字节序(低字节在前):- 1234的十六进制值是
0x04D2; - 小端序要求把低字节放在前面,拆分为
0xD2、0x04; - 因为
l是4字节类型,剩余两个字节补0,最终得到\xd2\x04\x00\x00。
- 1234的十六进制值是
2. 为何1234567812345678前仅出现一个\x,其他部分却有多个\x前缀?
- Python打印bytes对象时,仅对不可打印的ASCII字符用
\x+十六进制表示,可打印字符(比如数字0-9)直接显示原字符:\xd2、\x04、\x00、\x02都是不可打印的控制字符或非ASCII字符,所以用\x格式;- 字符串部分的
1-9是可打印ASCII字符,直接显示; 12345678...前的\x00是前一个2字节字段的第二个字节(数字2的小端编码是\x02\x00),属于不可打印的空字节,所以用\x表示。
3. 输出结果如何体现4字节、2字节、16字节的字段长度定义?
输出的二进制内容可按格式符对应的长度拆分:
- 前4字节:
\xd2\x04\x00\x00→ 对应l格式(4字节长整型),匹配field_size_4_bytes的4字节定义; - 中间2字节:
\x02\x00→ 对应h格式(2字节短整型),匹配field_size_2_bytes的2字节定义; - 最后16字节:
1234567812345678→ 每个ASCII字符占1字节,共16个字符,对应16s格式(16字节字符串),匹配field_size_16_bytes的16字节定义。
总长度为4+2+16=22字节,和输出的bytes对象长度一致。
内容的提问来源于stack exchange,提问作者user20007266
相关产品推荐
相关产品推荐

