具有不同大小的位字段的数据结构

时间:2010-04-19 13:21:37

标签: c++

如果我需要创建具有以下字段的数据结构:

16位大小字段

3位版本字段

1位CRC字段

我如何编码这个结构?我知道Size字段是unsigned short类型,但其他两个字段呢?

2 个答案:

答案 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);
   }
};