如果我有一个要求,创建具有以下字段的数据结构:具有不同尺寸的位字段
16位大小字段
3位版本字段
1- bit CRC field
我该如何编码这个结构?我知道尺寸字段将是unsigned short
类型,但其他两个字段呢?
如果我有一个要求,创建具有以下字段的数据结构:具有不同尺寸的位字段
16位大小字段
3位版本字段
1- bit CRC field
我该如何编码这个结构?我知道尺寸字段将是unsigned short
类型,但其他两个字段呢?
首先,unsigned short
不保证只有16位,只是至少有 16位。
你可以这样做:
struct Data
{
unsigned short size : 16;
unsigned char version : 3;
unsigned char crc : 1;
};
假设你想要的字段之间没有填充,你必须发给你的编译器的相应说明。与海湾合作委员会,你可以用__attribute__((packed))
装饰结构:
struct Data
{
// ...
} __attribute__((packed));
在Visual C++中,你可以使用#pragma pack
:
#pragma pack(push, 0)
struct Data
{
// ...
};
#pragma pack(pop)
下面的类实现您作为一种位域的寻找领域。
struct Identifier
{
unsigned int a; // only bits 0-19 are used
unsigned int getSize() const {
return a & 0xFFFF; // access bits 0-15
}
unsigned int getVersion() const {
return (a >> 16) & 7; // access bits 16-18
}
unsigned int getCrc() const {
return (a >> 19) & 1; // access bit 19
}
void setSize(unsigned int size) {
a = a - (a & 0xFFF) + (size & 0xFFF);
}
void setVersion(unsigned int version) {
a = a - (a & (7<<16)) + ((version & 7) << 16);
}
void setCrc(unsigned int crc) {
a = a - (a & (1<<19)) + ((crc & 1) << 19);
}
};
即使使用打包,也无法保证位域跨越字节边界打包。我相信VC++只会打包字节,所以你会得到一个4字节的结构总数(大小为2个字节,版本为1个字节,crc为1个字节)。 – jalf 2010-04-19 16:43:38