P
y
t
h
o
n
Python
Python 在二进制写文件时,可以用
s
t
r
u
c
t
struct
struct 模块将数据捆绑成结构体转化成字节流,为了方便与
C
C
C 交互,避免
C
C
C 在读取二进制字节流时因为
C
C
C 的字节对齐问题而造成不必要的麻烦,
P
y
t
h
o
n
Python
Python 的
s
t
r
u
c
t
struct
struct 模块默认按照
C
C
C 的字节对齐方式进行对齐。
然而,并不像想象中那样简单。
P
y
t
h
o
n
Python
Python 的
s
t
r
u
c
t
struct
struct 模块的字节对齐坑了我整整一上午。
首先我用
P
y
t
h
o
n
Python
Python 写好了二进制文件,并且测试用
P
y
t
h
o
n
Python
Python 去读取该二进制文件,测试良好,没有什么问题,但是当我写
C
C
C 的接口时,却发现数据一直有问题。经过一上午的排查,总算发现,字节的读取地址出现了问题,然而
P
y
t
h
o
n
Python
Python 的却没有这个问题,所以一下子就断定是
s
t
r
u
c
t
struct
struct 模块的字节对齐出了幺蛾子。
这里我用
P
y
t
h
o
n
Python
Python 写进了一堆
H
e
a
d
e
r
Header
Header,
struct header
{
long long a;
int b;
};
转化成
s
t
r
u
c
t
struct
struct 模块的格式化字符串为
′
q
i
′
'qi'
′qi′,在
C
C
C 中,由于字节对齐的缘故,这个
H
e
a
d
e
r
Header
Header 应该占有
16
16
16 个字节,但是在
P
y
t
h
o
n
Python
Python 里却不是这样……
>>> import struct
>>> struct.calcsize('qi')
12
竟然等于
12
12
12 个字节,显然没有字节对齐……然后试了一下
′
i
q
′
'iq'
′iq′,又让我吃了一惊……
>>> struct.calcsize('iq')
16
你没有看错,这里竟然字节对齐了,变成了
16
16
16 字节。这波操作骚气啊……
用
C
C
C 反复测试了两种写法,结果均为
16
16
16 字节。
不知道该怎么喷
P
y
t
h
o
n
Python
Python,最后图个省事儿,弄成了
′
2
q
′
'2q'
′2q′,妈妈再也不用担心字节对齐的问题了。
不过,有那么一种可能是,不同的
C
C
C 编译器对这两种写法的字节对齐方式存在差异?不得而知,也没有具体去测试,毕竟我是一个不求甚解的人。
对了,如果有哪位大佬的编译器的确是不一样的字节对齐结果,麻烦告知用的是什么编译器,让我避开他……