2014-05-23 37 views
1

我基本上試圖使用聯合來將具有不同位寬的數據塊結構轉換爲漂亮的整數數組。我寫了一個小程序來說明我的問題。使用聯合寫入位邊界

#include <stdio.h> 
#include <iostream.h> 

union { 
    struct { 
    long blah1; 
    short blah2; 
    long blah3; 
    short blah4; 
    int blah5; 
    } data; 
    int buffer[6]; 
} db; 

int main(int argc, char* argv) 
{ 
    db.data.blah1 = 0x1111111111111111; 
    db.data.blah2 = 0x2222; 
    db.data.blah3 = 0x3333333333333333; 
    db.data.blah4 = 0x4444; 
    db.data.blah5 = 0x55555555; 

    for(int i=0;i<6;i++) cout << "Word " << i << ": " << std::hex << db.buffer[i] << endl; 
} 

輸出:

Word 0: 11111111 
Word 1: 11111111 
Word 2: 2222 
Word 3: 0 
Word 4: 33333333 
Word 5: 33333333 

預期輸出:

Word 0: 11111111 
Word 1: 11111111 
Word 2: 33332222 
Word 3: 33333333 
Word 4: 44443333 
Word 5: 55555555 

我使用編譯gcc版本4.1.2 20080704(紅帽4.1.2-54)

我是否有格式不正確的東西,還是我想爲som使用此功能?除了它的意圖之外的東西?有沒有另一種方法可以實現我的預期產出,而無需使用按位操作和無盡轉移?

+0

檢查'的sizeof(db.data)' –

+0

看看http://stackoverflow.com/questions/3318410/pragma-pack-effect – happydave

+0

@ happydave的鏈接幾乎回答了這個問題。所以雖然問題非常不同,但答案適用於這種情況。 – Floris

回答

0

正如@happydave和Floris所指出的,通過使用值爲1的編譯指導包可以實現結果,以停止引入位對齊的填充。

#include <stdio.h> 
#include <iostream> 

using namespace std; 

#pragma pack(push,1) 
union { 
    struct { 
    long blah1; 
    short blah2; 
    long blah3; 
    short blah4; 
    int blah5; 
    } data; 
    int buffer[6]; 
} db; 
#pragma pack(pop) 

int main(int argc, char** argv) 
{ 
    db.data.blah1 = 0x1111111111111111; 
    db.data.blah2 = 0x2222; 
    db.data.blah3 = 0x3333333333333333; 
    db.data.blah4 = 0x4444; 
    db.data.blah5 = 0x55555555; 

    for(int i=0;i<6;i++) cout << "Word " << i << ": " << std::hex << db.buffer[i] << endl; 
} 
+0

謝謝!這完美的作品! – user3667190