我需要处理下列形式的一些数据:
typedef struct{
unsigned n1 : 12;
unsigned n2 : 12;
unsigned n3 : 12;
unsigned n4 : 1;
unsigned n5 : 35;
} data;
我确保它们总共加起来是9个字节。但事实并非如此。将这个结构体的9个字节写入文件并读回来后,并不能恢复所有数据,sizeof(data)
返回16。
问题出在哪里呢?
我需要处理下列形式的一些数据:
typedef struct{
unsigned n1 : 12;
unsigned n2 : 12;
unsigned n3 : 12;
unsigned n4 : 1;
unsigned n5 : 35;
} data;
我确保它们总共加起来是9个字节。但事实并非如此。将这个结构体的9个字节写入文件并读回来后,并不能恢复所有数据,sizeof(data)
返回16。
问题出在哪里呢?
你可以使用gcc特定的强制对齐:
typedef struct{
unsigned n1 : 12;
unsigned n2 : 12;
unsigned n3 : 12;
unsigned n4 : 1;
unsigned n5 : 35;
} data __attribute__((__packed__));
阅读:http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html
这在一个36位的计算机上会非常有效。你忘了告诉我们你是否拥有这样的计算机...
在一个更常见的32位机器上,使用9字节对齐将非常难以实现。如果你创建一个这些结构体的数组,你需要不同的代码来访问一个地址模0和一个地址模9的对象中的字段。
前三个字段的12位必须从不同的unsigned
收集,并且根据地址的不同而有所不同。
除非你有具有位寻址功能(或者36位CPU)的硬件,否则其他答案中的打包指令在此处不太可能起作用。