2012-04-30 42 views
0

我有一个Visual Studio 2008 C++项目,我需要解码一个结构中的6字节数据数组。将二进制数据blob解码为结构

我的想法是做这样的事情:

#pragma pack(push, 1) 
struct Map 
{ 
    BYTE alpha : 8; 
    BYTE bravo : 8; 
    UINT charlie : 24; 
    BYTE delta : 8; 
    BYTE padding0 : 8; // ensure correct byte boundary 
    BYTE padding1 : 8; 
}; 
#pragma pack(pop) 
// sizeof(Map) == 8 bytes 

BYTE test_data[ 6 ] = { 0x07,  // alpha 
         0x0B,  // bravo 
         0x00,  // charlie high byte 
         0x00,  // charlie med byte 
         0x01,  // charlie low byte 
         0x33 }; // delta 
Map map = { }; 
memcpy(&map, test_data, sizeof(test_data)); 
ASSERT(map.alpha == 0x07); 
ASSERT(map.bravo == 0x0B); 
ASSERT(map.charlie == 0x01); 
ASSERT(map.delta == 0x33); 

但是,在charliedelta的数据是正确的永远。

有没有一种方法来构建我的结构来得到这个正确或我坚持单独设置每个字段?

谢谢

+1

你看起来像你只投入3个字节为查理;一个32位平台将需要4个字节。另外,确保你的永久性是正确的。 –

回答

1

要做到这一点在便携方式:

struct Map 
{ 
    BYTE alpha; 
    BYTE bravo; 
    UINT charlie; 
    BYTE delta; 

    Map(const BYTE data[6]) 
    : alpha(data[0]) 
    , bravo(data[1]) 
    , charlie((data[2] << 16) | (data[3] << 8) | data[4]) 
    , delta(data[5]) 
    {} 
}; 

int main() 
{ 
    BYTE test_data[ 6 ] = { 0x07,  // alpha 
       0x0B,  // bravo 
       0x00,  // charlie high byte 
       0x00,  // charlie med byte 
       0x01,  // charlie low byte 
       0x33 }; // delta 
    Map map(test_data); 
    ASSERT(map.alpha == 0x07); 
    ASSERT(map.bravo == 0x0B); 
    ASSERT(map.charlie == 0x01); 
    ASSERT(map.delta == 0x33); 
} 
0

你不能天真地序列化化合物类型。只是把它写自己:

std::tuple<char, char, unsigned int, char> 
parse(char const * buf) 
{ 
    return std::make_tuple(buf[0], 
          buf[1], 
          buf[2] + 256 * buf[3] + 256 * 256 * buf[4], 
          buf[5]); 
} 

当然,你必须整数的字节顺序匹配到这是由你的序列化格式,小尾数在我的例子证明。

相关问题