0

freadを使用してファイルからビットストリームを読み取ろうとしていました

fread(buff, buffSize, 1, fp);

buff is the buffer to which i am readingbuffSize is the size of buffer、そしてfp is the file pointerそこから私は読んでいます。データをバッファーに読み取った後、バッファーの内容を別の構造変数に型キャストしようとしました。構造は次の形式です

typedef struct data
{
    char    id;
    short   value1;
    short   value2;
    ....
}data;

私がしたことは

data* var;
var = (data*)buff;

次に、構造内の変数にアクセスしてみました。ビットストリームが00 b0 11 c1 00そのような場合は、である var->id必要があります0x00var->value1あるべきであり0xb011var->value2あるべきである0xc100

しかし、私が得ているのは

var->id = 0x00;
var->value1 = 0x11c1;
...

なぜ私は期待通りになっていないのですか?最初のパラメータタイプをshortに変更すると、値が取得されましたvar->id was 0x00b0。最小アクセスサイズのようなものはあり2 Bytesますか?この問題を解決する方法は?var->idフィールドへの最初のバイトのみを読み取りたいだけです。

4

1 に答える 1

2

これは、位置合わせに使用されるの直前にパディングフィールドvalue1があるために発生します。構造体を削除したい場合は、構造体を「パック」するようにコンパイラーに指示してください。各コンパイラの構文は異なります。たとえば、次のgccように言います。

struct  __attribute__ ((__packed__)) data {
    /* ... */
};
于 2013-03-02T19:34:11.050 に答える