2010-04-19 114 views
0
数据结构

如果我有一个要求,创建具有以下字段的数据结构:具有不同尺寸的位字段

16位大小字段

3位版本字段

1- bit CRC field

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

回答

1

首先,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) 
+0

即使使用打包,也无法保证位域跨越字节边界打包。我相信VC++只会打包字节,所以你会得到一个4字节的结构总数(大小为2个字节,版本为1个字节,crc为1个字节)。 – jalf 2010-04-19 16:43:38

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