python - struct.pack 比它的部分长?
问题描述
我想解压 6 个值: 2 * UInt16
、 1 * UInt32
、 1 * UInt16
、 2 *Int64
以字节为单位添加大小,我得到 26。
但是python似乎认为应该是32:
>>> a = struct.pack("H",0)
>>> len(a)
2 <-- correct
>>> a = struct.pack("L",0)
>>> len(a)
4 <-- correct
>>> a = struct.pack("q",0)
>>> len(a)
8 <-- correct
>>> a = struct.pack("HHLHqq",0,0,0,0,0,0)
>>> len(a)
32 < -- should be 2 + 2 + 4 + 2 + 8 + 8 = 26
>>> a = struct.pack("HHLHq",0,0,0,0,0)
>>> len(a)
24 < -- should be 2 + 2 + 4 + 2 + 8 = 18
>>> a = struct.pack("HHLH",0,0,0,0)
>>> len(a)
10 <-- correct again
struct.unpack
有同样的问题,需要 32 字节来解压“HHLHqq”。但是,在我的应用程序中,数据是从外部源发送的,只有 26 个字节。
我可以将它一个一个解包作为一种解决方法,但是必须有一种方法可以肯定地禁用此填充?
解决方案
根据:https ://docs.python.org/2/library/struct.html
使用非本机大小和对齐方式时不添加填充,例如使用 '<'、'>'、'=' 和 '!'。
所以你只需要指定字节顺序,填充就会消失:
>>> import struct
>>> len(struct.pack("HHLHqq",0,0,0,0,0,0))
40
>>> len(struct.pack("<HHLHqq",0,0,0,0,0,0))
26
>>>
推荐阅读
- flutter - 为什么在变量中调用我的图像资产时出现错误?它说“FlutterError(无法加载资产:)”
- python - 服务器是否在主机 localhost 上运行并接受端口 5432 上的 TCP/IP 连接?
- javascript - 如何在反应应用程序中添加外部javascript
- bazel - Bazel - 取决于生成的输出
- javascript - 设置动态创建的表格的列宽以适合内容
- c# - 我可以从 ASP.NET MVC 中的 Model.edmx 文件中获取存储过程脚本吗?
- agda - 目标隐含的参数定理
- javascript - 编辑表格中的单元格时如何更改字体大小
- api - 如何限制对anypoint平台公共url的访问
- php - Laravel - 查询以多对多关系连接表