0

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

これを正しくするために構造体を構造化する方法はありますか、それとも各フィールドを個別に設定するのに行き詰まっていますか?

ありがとう

4

2 に答える 2

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 );
}
于 2012-04-30T17:26:01.920 に答える
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]);
}

もちろん、整数のエンディアンを、シリアル化された形式(私の例ではリトルエンディアン)で文書化されているものと一致させる必要があります。

于 2012-04-30T17:14:08.720 に答える