我有一个Visual Studio 2008 C ++项目,我需要将一个6字节的数据数组解码到一个结构中。
我的想法是做这样的事情:
#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 );
但是,charlie
和delta
中的数据永远不正确。
有没有办法构建我的结构以使其正确或我是否单独设置每个字段?
由于
答案 0 :(得分: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 );
}
答案 1 :(得分: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]);
}
当然,您必须将整数的字节顺序与序列化格式(我的示例中的little-endian)记录的字节顺序相匹配。