c++ - 将二进制数据 blob 解码为结构

标签 c++

我有一个 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 );

但是,charliedelta 中的数据永远不会正确。

有没有一种方法可以构造我的结构以使其正确,或者我是否坚持单独设置每个字段?

谢谢

最佳答案

以便携的方式做到这一点:

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 );
}

关于c++ - 将二进制数据 blob 解码为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387660/

相关文章:

c++ - 如何获取桌面上图标的名称

c++ - 帮助处理奇怪的内存行为。在我的大脑和代码中寻找漏洞

c++ - 如何在 C++ 中复制 std::string 类型的字符串?

c++ - DevIL 图像无法正确呈现

c++ - 使用模板参数推导推导类的 "outer class"

c++ - 混合调试和发布库 : Windows vs Linux, 静态与共享

c++ - vector 索引变量声明(size_t 或 std::vector<DATATYPE>::size_type)

C++函数式编程代码片段

C++ 数组初始化

c++ - 需要帮助从 libjpeg 编译 jpegtran.c 代码