前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python: struct 模块之字节对齐问题

Python: struct 模块之字节对齐问题

作者头像
f_zyj
发布2021-12-07 16:47:44
1.8K0
发布2021-12-07 16:47:44
举报

Python在二进制写文件时,可以用 struct 模块将数据捆绑成结构体转化成字节流,为了方便与 c 交互,避免 c 在读取二进制字节流时因为 c 的字节对齐问题而造成不必要的麻烦,Pythonstruct 模块默认按照 c 的字节对齐方式进行对齐。

然而,并不像想象中那样简单。Pythonstruct 模块的字节对齐坑了我整整一上午首先我用 Python 写好了二进制文件,并且测试用Python 去读取该二进制文件,测试良好,没有什么问题,但是当我写 c 的接口时,却发现数据一直有问题。经过一上午的排查,总算发现,字节的读取地址出现了问题,然而 Python 的却没有这个问题,所以一下子就断定是 struct 模块的字节对齐出了幺蛾子这里我用 Python 写进了一堆 Header

struct header
{
	long long a;
	int b;
};

转化成 struct 模块的格式化字符串为 'qi' ,在 C 中,由于字节对齐的缘故,这个 Header 应该占有16 个字节,但是在 Python 里却不是这样……

>>> import struct
>>> struct.calcsize('qi')
12

竟然等于 12 个字节,显然没有字节对齐……然后试了一下 'qi' ,又让我吃了一惊……

>>> struct.calcsize('iq')
16

你没有看错,这里竟然字节对齐了,变成了 16 字节。这波操作骚气啊……用 C 反复测试了两种写法,结果均为 16 字节。

不知道该怎么喷 Python ,最后图个省事儿,弄成了 '2q' ,妈妈再也不用担心字节对齐的问题了。

不过,有那么一种可能是,不同的 C 编译器对这两种写法的字节对齐方式存在差异?不得而知,也没有具体去测试,毕竟我是一个不求甚解的人。

对了,如果有哪位大佬的编译器的确是不一样的字节对齐结果,麻烦告知用的是什么编译器,让我避开他……

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档