zoukankan      html  css  js  c++  java
  • python struct.pack中的对齐字节问题

    最近测试涉及到了序列字节化相关问题,碰到一个头疼的问题

    buff = struct.pack("3s","B00")
        print repr(buff)

    输出:'B00'

     buff = struct.pack('i',10172)
     print repr(buff)

    输出:"xbc'x00x00"

    buff = struct.pack("3si","B00",10172)
    print repr(buff)

    输出:"B00x00xbc'x00x00"

    即:struct.pack("3s","B00")+struct.pack('i',10172) != struct.pack("3si","B00",10172)

    但struct.pack("!3s","B00")+struct.pack('!i',10172) == struct.pack("!3si","B00",10172)是相等的

    问题分析:

    为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

    CharacterByte orderSize and alignment
    @ native native            凑够4个字节
    = native standard        按原字节数
    < little-endian standard        按原字节数
    > big-endian standard       按原字节数
    ! network (= big-endian)

    standard       按原字节数

    使用方法是放在fmt的第一个位置,就像'@5s6sif'

    参见如下

    http://www.coder4.com/archives/3838

    http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html

    http://zhidao.baidu.com/link?url=Wd7SipMBMz7-lCTtnV3kUmjF4OMlRqZZUtfY0Zb3SqF5HKsCbwUBJFw8s2FfpTTv55Y-o-YHctDEfJoQ_ILTYAM8-sOWvOPS4aJtlHffNZ_

  • 相关阅读:
    LightOJ 1139 8 puzzle + hdu 1043 Eight A*
    hdu 1180 优先队列 + bfs
    hdu 1270
    HDU Doing Homework
    hdu 1171 Big Event in HDU
    hdu 3613 (KMP)回文串
    POJ 3461 Oulipo(KMP)
    POJ 1565(DP状态压缩)
    NYOJ 634 万里挑一(优先队列)
    职场手记1_你想成文什么样的人
  • 原文地址:https://www.cnblogs.com/xywq/p/4898373.html
Copyright © 2011-2022 走看看