1

そこに:私は次のような宣言をしています:

typedef struct
{
    quint8  mark1;
    quint16 content1;
    quint16 content2;
    quint8  mark2;
}FrameHead;

関数では、バッファを定義し、それを評価しました。

quint8 buf[40];
FrameHead *frame  = (FrameHead *)buf;
frame->mark1 = 0x68;
frame->content1 = 0x3A;
frame->content1 = 0x3A;
frame->mark2 = 0x68;

だから私が思ったように、bufの最初の6バイトは「68 3A 00 3A 00 68」であるはずですが、実際には、bufの最初の8バイトは「68 90 3A 00 3A 00 68 80」でした。

qDebug() << (quint8 *)(++frame) - buf// output "8" but should be "6"

数字「0x68」は、他のquint16型との一貫性を保つためにquint8型ではなくquint16型として保存されたようです。誰もが同じ問題に遭遇し、何か提案があります。

4

1 に答える 1

1

これはアライメントによるものです。16 ビット型は 16 ビット アドレスに配置されます。最初のメンバーは 8 ビットしか使用しないため、1 バイトのパディングが挿入されます。

構造体を次のように並べ替えた場合

typedef struct
{
    quint8  mark1;
    quint8  mark2;
    quint16 content1;
    quint16 content2;
}FrameHead;

整列にパディングが必要ないため、6 バイトのみを使用しますcontent1

より詳細な説明については、構造のパディングとパッキングを参照してください。

コメント後に編集:

したがって、使用するか#pragma pack(1)http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=VS.100%29.aspxを参照)(意味がわからない

VCの「#Pragma」のようにQtでアライメントを設定するには」

) または単に配列を使用します。

typedef quint[6] FrameHead;

....

FrameHead fh1 = {0x68, 0x00, 0x00, 0x00, 0x00, 0x68};
// or 
FrameHead fh2;
memset( fh2, 0, sizeof(FrameHead));
fh2[0] = 0x68;
fh2[5] = 0x68;
于 2013-05-01T15:01:06.547 に答える