如果我需要创建具有以下字段的数据结构:
16位大小字段
3位版本字段
1位CRC字段
我如何编码这个结构?我知道Size字段是unsigned short
类型,但其他两个字段呢?
答案 0 :(得分:1)
首先,unsigned short
不能保证只有16位,只有至少 16位。
你可以这样做:
struct Data
{
unsigned short size : 16;
unsigned char version : 3;
unsigned char crc : 1;
};
假设您希望字段之间没有填充,则必须向编译器发出适当的指令。使用gcc,您可以使用__attribute__((packed))
:
struct Data
{
// ...
} __attribute__((packed));
在Visual C ++中,您可以使用#pragma pack
:
#pragma pack(push, 0)
struct Data
{
// ...
};
#pragma pack(pop)
答案 1 :(得分:1)
以下类将您要查找的字段实现为一种位域。
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);
}
};