2016-09-13 10 views
0

は、だから私はfwrite()のファイルに、生のバイナリとしてlongの値を書き込むしようとしているファイルに、ここでのテストファイルですテキストエディタは、これが出力されます。書き込み数が

ff0f 0000 0000 0000 

私は0000 0000 0000 0fffような何かを期待している間。

はどのようにして生のバイナリとして正しく望ましい結果を書くのですか?

+0

"マーシャル"/"シリアライゼーション"を検索します。ここで、それについてのWebの残りの部分で見つけられれば十分です。メモリ領域の書き込みだけでなく、シフト/マスキングを使用してデータをシリアル化します。 – Olaf

+5

[endianness](https://en.wikipedia.org/wiki/Endianness)...ダークマジック – LPs

+1

おそらく、表示に使用しているものによって、16進ダンプの表示方法と関連があります。 –

答えて

2

問題ありません。マシンのエンディアンが原因でff0f 0000 0000 0000が表示されています。 代わりにfread()を試してみてください!

+0

はい! fread()はlong値を正しく読み取ります。 – Mossmyr

1

他のコメントで指摘したように、これは、エンディアン「問題」です。それは、他のエンディアンを持つシステムでソフトウェアを実行する場合にのみ問題になります。

This very useful resourceは、少なくとも私にとっては、「Cのエンディアン」Google検索のための最初の結果です。それがあなたを助けることを願っています


編集:私は以下の詳細を少し詳しく掘り下げます。

現在実行中のマシンのエンディアンが何であるかを調べるには、既知の値(たとえば、0xAABBCCDD)をメモリに書き込み、その値へのポインタを取得してchar *バイトデータ型。同じ値をバイト単位でもう一度読み、書いたものと順序を比較してください。それらが同じであれば、あなたはビッグエンディアンマシンにいます。そうでなければ...少し(おそらく)、または中(潜在的ではない)のエンディアンマシンにいる可能性があります。どちらの場合も、バイトを並べ替える「スワップマップ」を生成できます。上記の例で4つの異なるバイト値を選択したのはこのためです。

しかし、これらの値を交換するにはどうすればよいですか?簡単な方法は、hereと表示されているように、マスクでビットシフトを使用することです。また、テーブルを使用して値を交換することもできます。

3

Endiannessについては、コンピュータシステム内の単語(またはダブル/クワッドワードなど)にバイトがどのように配置されるかを示します。

この例をX86システムでコーディングしてコンパイルしたとします。これはリトルエンディアンです。したがって、最下位ビットはCOME FIRSTです。その配置の反対は、ビッグエンディアンと呼ばれます。

さて、後で、おそらく別のプログラムによって、検索されるいくつかのバイトこの演習では、あなたの目的は、(あなたのあなたの専門用語を好む方法に応じて、またはピクルスマーシャルにあることは明らかです。

同じendiannessのマシンでfread()を使用し、同じ方法(sizeof(long)を使用してデータを読み取らないようにする)とでデータを読み取るプログラムを開発する場合は、それは魔法のように動作し、あなたが期待している数字が戻ってきます。しかし、反対のエンディアンのマシンで "読み込み"ツールをコンパイルして実行して、同じ入力ファイルを読み込んだ場合、あなたの番号は文字化けします。

あなたの目的は、マーシャルデータにある場合、あなたはエンディアンに依存しないた方法でマーシャルあなたのバイトをお手伝いをするためのツールとしたほうが良いはずです、それは、あなたがデータを得ることができますライブラリです正しい順序。あなたのためにそれを世話するライブラリがあります。