1

構造体で memcpy を使用すると問題が発生します。

次の構造体を検討してください

struct HEADER
{
    unsigned int preamble;
    unsigned char length;
    unsigned char control;
    unsigned int destination;
    unsigned int source;
    unsigned int crc;
}

memcpy を使用して受信バッファーからこの構造体にデータをコピーすると、コピーは問題ありませんが、構造体を次のように再宣言すると:

struct HEADER
{
    unsigned int preamble;
    unsigned char length;
    struct CONTROL control;
    unsigned int destination;
    unsigned int source;
    unsigned int crc;
}

struct CONTROL
{
    unsigned dir : 1;
    unsigned prm : 1;
    unsigned fcb : 1;
    unsigned fcb : 1;
    unsigned function_code : 4;
}

以前と同じ memcpy コードを使用すると、最初の 2 つの変数 ( preamble と length ) が正常にコピーされます。コントロールが完全にめちゃくちゃになっていて、最後の 3 つの変数が 1 つ上にシフトされています。つまり、crc = 0、source = crc、destination = source... です。

A誰か私に何か良い提案はありますか?

4

5 に答える 5

0

チェックsizeof(struct CONTROL)-- マシンによっては 2 または 4 になると思います。unsignedビットフィールドを使用しているため(およびunsignedの短縮形unsigned int)、構造全体 (struct CONTROL) は少なくとも unsigned int のサイズ、つまり 2 または 4 バイトを必要とします。

そして、使用すると、unsigned char controlこのフィールドに 1 バイトかかります。controlしたがって、間違いなく、変数を見つめる不一致があるはずです。

以下のように書き換えてみてくださいstruct control: -

struct CONTROL
{
    unsigned char dir : 1;
    unsigned char prm : 1;
    unsigned char fcb : 1;
    unsigned char fcb : 1;
    unsigned char function_code : 4;
}
于 2013-10-09T10:57:33.727 に答える