比方说,为了在文件中存储一个特定的内容,需要表达命令、分组、数据、来源、是否准备好等信息,经过分析你认为命令最多需要5位就够了,分组则需要9位才行,数据需要8位,来源需要12位,是否准备好只要1位。
那么就定义一个5字节的数组好了,然后再程序里分配每个字节的特定位所代表的含义。
这样的程序到底有多大,只有亲自编写了才知道,如果只写一次也就罢了,就怕突然有一天冒出一个需求,要将这些数据在网络上传输,内容都差不多,只是字节的顺序有些不同而已,天哪...我需要重写几乎所有代码,而且我还要重新测试这些代码。
有一个方法,可以轻松解决你的问题:使用位段。
位段的使用非常简单,类似下面例子中的代码:
struct _tag_Record
{
unsigned int command : 5;
unsigned int group : 5;
unsigned int flag : 5;
unsigned int isready : 1;
};
int main(void)
{
struct _tag_Record f;
int size = 0;
size = sizeof(struct _tag_Record);
f.command = 3;
f.group = 3;
while(1)
{
f.isready++;
size++;
}
return 0;
}
如果真的出现了上面的需求,你只需要调整一下结构体中位段的先后顺序、甚至大小。而代码的测试工作相比起来就要小很多了。
不过需要注意的是。不同的编译器对位段的支持有所不同,包括对齐方式、字节顺序等等,都会给位段的使用带来影响。