2016-09-18 19 views
-1

構造体定義を使用して、バイナリファイル内のデータメンバーにアクセスしようとしています。構造体のC++へのアクセス

このファイルの内部には、fxIDという構造体メンバが含まれている必要があります。次のコードでは、fxIDにアクセスしようとしていますが、機能していません。不正な番号が返されています。さらに不思議なことに、fxIDをfxVersionに変更した場合、同じ数値になるので、printfが正しいデータを一切取り上げていないように見えます。

FILE *p; 
struct myStruct x; 
p=fopen("myfile.fxb","rb"); 

size_t n = fread(&x, sizeof(x), 1, p); 
if (n != 1) { 
    // Some error message 
    //printf("%i", sizeof(x)); 
} else { 
    printf("\n\nID:%d\n", x.fxID); 
} 

なぜfxID内のデータにアクセスできないのですか?私はprintfステートメントでどのタイプを使用するかによって、奇妙な結果を得ています。たとえば、printf( "%d"、x.fxID)を使用すると1606416148という数字が得られます。しかし、これは間違っています。私はfxIDが1447514692だと信じているからです。これはエンディアンのためですか?私はファイルがビッグエンディアンであることを知っています。リンクされたヘッダーファイルでそれを変換する必要があると言います。

Intを使用している可能性がありますか?おそらく間違ったタイプですか?

+1

私はデジャ-VOUS持っていると思う - http://stackoverflow.com/questions/39556266/cc-extract-struct-member-from-binary-file/39556551#comment66424088_39556551 –

+0

は、開始時にマーカーが必要になる場合があります'VST_2_4_EXTENSIONS'のファイル。 –

+0

はい、自分の構造体定義に追加するのを忘れました。if文を削除していますが、構造体内のデータに意味のあるデータをアクセスできない理由を理解しようとしています方法。 Imが直面する問題の解決策をまだ見つけていません。 –

答えて

1

ファイルで使用されているものがプラットフォームで使用されているものと異なる場合は、必ずエンディアンを修正する必要があります。フォーマットがビッグエンディアンのレイアウトを使用して格納されている場合は、x64で作業している場合は、各マルチバイトフィールドのバイトをスワップする必要があります。

しかし、これはあなたのstructのレイアウトが、パディングとアライメントの要件を含む可能性があるのでファイルフォーマットで使用されているものと同じであることを保証するには不十分です。したがって、一般に、バイナリデータをstructあなたは複数のことを世話する必要があります。それぞれ異なるエンディアンと同じ値でない0x5FBFF7140x56475244あるヘクスの両方のための任意の場合において

得られた結果は、16064 1 6148であり、あなたがエンディアン1447514692を期待していた場合には、唯一の問題ではありません。

は、ディレクティブを使用して、値のない構造体内のfxIDフィールドのアドレスを返します。

+0

ok、x.fxIDに直接変更されましたが、今は0を返しています。なぜそれが不思議ですか? 1447514692でなければなりません。私はfxVersionのような構造体の他の部分にもアクセスできません。あなたが添付ファイルにチェックして、確認する機会がありますか? –

+0

私がx.byteSizeを使用すると、それはkBxFである6b427846の16進値を与えています。これは後方に(ビッグエンディアンのために)FxBkです。だから、なぜfxBkメッセージがfxMagicで見つかるはずの変数byteSizeに出てくるのですか?明らかにデータは何とか整列していませんか? –

関連する問題