2012-04-30 45 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]); 
} 

當然,你必須整數的字節順序匹配到這是由你的序列化格式,小尾數在我的例子證明。

相關問題