Force C++ structure to pack tightly

前端 未结 2 1036
伪装坚强ぢ
伪装坚强ぢ 2020-11-28 06:23

I am attempting to read in a binary file. The problem is that the creator of the file took no time to properly align data structures to their natural boundaries and everythi

相关标签:
2条回答
  • 2020-11-28 07:03

    If you're using GCC, you can do struct __attribute__ ((packed)) { short a; int b; }

    On VC++ you can do #pragma pack(1). This option is also supported by GCC.

    #pragma pack(push, 1)
    struct { short a; int b; }
    #pragma pack(pop)
    

    Other compilers may have options to do a tight packing of the structure with no padding.

    0 讨论(0)
  • 2020-11-28 07:08

    You need to use a compiler-specific, non-Standard directive to specify 1-byte packing. Such as under Windows:

    #pragma pack (push, 1)
    

    The problem is that the creator of the file took no time to properly byte align the data structures and everything is packed tight.

    Actually, the designer did the right thing. Padding is something that the Standard says can be applied, but it doesn't say how much padding should be applied in what cases. The Standard doesn't even say how many bits are in a byte. Even though you might assume that even though these things aren't specified they should still be the same reasonable value on modern machines, that's simply not true. On a 32-bit Windows machine for example the padding might be one thing whereas on the 64-bit version of Windows is might be something else. Maybe it will be the same -- that's not the point. The point is you don't know what the padding will be on different systems.

    So by "packing it tight" the developer did the only thing they could -- use some packing that he can be reasonably sure that every system will be able to understand. In that case that commonly-understood packing is to use no padding in structures saved to disk or sent down a wire.

    0 讨论(0)
提交回复
热议问题