4

我正在处理一些数据包数据。我创建了结构来保存数据包数据。这些结构是由 python 为特定的网络协议生成的。

问题是由于编译器对齐结构这一事实,当我通过网络协议发送数据时,消息最终比我想要的要长。这会导致其他设备无法识别该命令。

有谁知道可能的解决方法,以便我的打包程序与结构的大小完全相同,或者有没有办法可以关闭内存对齐?

4

1 回答 1

6

在 GCC 中,您可以使用__attribute__((packed)). 现在 GCC#pragma pack也支持 .

  1. attribute文件
  2. #pragma pack文件

例子:

  1. attribute方法:

    #include <stdio.h>
    
    struct packed
    {
        char a;
        int b;
    } __attribute__((packed));
    
    struct not_packed
    {
        char a;
        int b;
    };
    
    int main(void)
    {
        printf("Packed:     %zu\n", sizeof(struct packed));
        printf("Not Packed: %zu\n", sizeof(struct not_packed));
        return 0;
    }
    

    输出:

    $ make example && ./example
    cc     example.c   -o example
    Packed:     5
    Not Packed: 8
    
  2. pragma pack方法:

    #include <stdio.h>
    
    #pragma pack(1)
    struct packed
    {
        char a;
        int b;
    };
    #pragma pack()
    
    struct not_packed
    {
        char a;
        int b;
    };
    
    int main(void)
    {
        printf("Packed:     %zu\n", sizeof(struct packed));
        printf("Not Packed: %zu\n", sizeof(struct not_packed));
        return 0;
    }
    

    输出:

    $ make example && ./example
    cc     example.c   -o example
    Packed:     5
    Not Packed: 8
    
于 2013-08-20T17:38:51.380 回答