2014-05-23 18 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