2010-04-19 115 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); 
    } 
};