You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字节长整型)打包,且格式字符串开头的<指定了小端字节序(低字节在前):
    1. 1234的十六进制值是0x04D2;
    2. 小端序要求把低字节放在前面,拆分为0xD2、0x04;
    3. 因为l是4字节类型,剩余两个字节补0,最终得到\xd2\x04\x00\x00。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:11:39