zoukankan      html  css  js  c++  java
  • python struct.pack('5sI', b'abc\x00', 1) 字节顺序,大小和对齐方式

    今天在 python 里面手动构造 C 的 struct 时,惊奇的发现 struct.pack('5sI', b'abc\x00', 1) 返回结果的长度是 12 !

    而 struct.pack('5s') + struct.pack('I', 1) 跟预想结果一致,是 9

    看文档:
    字节顺序,大小和对齐方式
    Byte Order, Size, and Alignment

    格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式:

    字符 字节顺序 大小 对齐方式
    @ 按原字节 按原字节 按原字节
    = 按原字节 标准
    < 小端 标准
    > 大端 标准
    ! 网络(=大端) 标准

    如果不填的话,默认就是 @,也就是说上面的 '5sI' 默认就是 '@5sI',也就是说按照 C 语言 struct 的尿性做对齐处理,相当于 C 的

    struct 
    {
      char s[5]; 
      int i;
    }; 
    

    按 4 字节对齐,最终大小就是 12

    我的需求其实是设置 C 的 #pragma pack(1) ,并且保持原始字节序,所以我的格式字符串应该改成 '=5sI'

    测试:

    >>> struct.calcsize('5sI')
    12
    >>> struct.calcsize('@5sI')
    12
    >>> struct.calcsize('=5sI')
    9
    >>> 
    
    
    +V d2h5X251bGw= 请备注:from博客园
  • 相关阅读:
    hdu 4403 枚举
    hdu 4405概率dp
    lightoj 1036 dp
    lightoj 1033 区间dp
    lightoj 1032 二进制的dp
    hdu 4293 dp求最大权值不重合区间
    poj 2449 第k短路
    hdu 4284 状态压缩
    hdu4281 区间dp
    poj 2288 tsp经典问题
  • 原文地址:https://www.cnblogs.com/hangj/p/15742872.html
Copyright © 2011-2022 走看看