3

私は無線規格を実装していますが、構造とメモリサイズの結合に問題があります。以下の例では、この構造を1バイトのメモリに配置する必要があります(無線標準に従って)が、現在は2バイトのサイズになっています。多くの掘り下げた後、私はそれがユニオンの「サイズ」が3ビットではなくバイトであるためだと理解しています...しかし、これを回避する方法はうまくいきませんでした。私は見ました:

しかし、どちらも私に解決策を与えていないようです。

何か案は?

ありがとう!

#ifdef WIN32
#pragma pack(push)
#pragma pack(1)
#endif

typedef struct three_bit_struct
{
    unsigned char bit_a : 1;
    unsigned char bit_b : 1;
    unsigned char bit_c : 1;
}three_bit_struct_T;


typedef union
{
    three_bit_struct_T three_bit_struct;
    unsigned char another_three_bits : 3;
}weird_union_T;


typedef struct
{
    weird_union_T problem_union; 
    unsigned char another_bit : 1;
    unsigned char reserved : 4;
}my_structure_T;


int _tmain(int argc, _TCHAR* argv[])
{
     int size;

     size = sizeof(my_structure_T);

     return 0;
}


#ifdef WIN32
#pragma pack(pop)
#endif
4

2 に答える 2

6

問題は、ビットフィールドに 3 ビットしか含まれていないにもかかわらず、*three_bit_struct_Tのサイズが最も近いバイトに切り上げられることです。構造体は、バイトの一部であるサイズを持つことはできません。したがって、 の余分なフィールドでそれを拡張すると、必然的にサイズが 2 番目のバイトにあふれます。my_structure_T

すべてのものを1バイトに詰め込むには、すべてのビットフィールドメンバーをmy_structure_T内部構造体/共用体として持つのではなく、外部に配置する必要があります.

あなたができる最善のことは、すべてを組合として持つことだと思います。

typedef struct
{
    unsigned char bit_a : 1;
    unsigned char bit_b : 1;
    unsigned char bit_c : 1;
    unsigned char another_bit : 1;
    unsigned char reserved : 4;
} three_bit_struct_T;

typedef struct
{
    unsigned char another_three_bits : 3;
    unsigned char another_bit : 1;
    unsigned char reserved : 4;
} another_three_bit_struct_T;

typedef union
{
    three_bit_struct_T three_bit_struct;
    another_three_bit_struct_T another_three_bit_struct;
} my_union_T;

(*) または単語。配置/パッキングの設定によって異なります。

于 2012-11-21T12:22:54.567 に答える
0

2つの良いアドバイス:データプロトコルにstruct / unionを使用しないでください。また、どのような状況でもビットフィールドを使用しないでください。

これを実装する最良の方法は、ビットマスクとビット単位の演算子を使用することです。

#define BYTE_BIT7 0x80u

uint8_t byte;

byte |= BYTE_BIT_7;  // set bit to 1
byte &= ~BYTE_BIT_7; // set bit to 0

if(byte & BYTE_BIT_7) // check bit value

このコードは、世界中のすべてのCコンパイラとC++に移植できます。

于 2012-11-21T12:48:38.930 に答える