[转载] Python: struct 模块之字节对齐问题

参考链接: Python中的struct模块

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 编译器对这两种写法的字节对齐方式存在差异?不得而知,也没有具体去测试,毕竟我是一个不求甚解的人。 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值