1

C function に「面白い」問題がありますfwrite。ポインタがunsigned intあり、それをバイナリ ファイルに書き込みたいので、fwrite. ただし、ファイル内のバイトは上下逆に書き込まれます。unsigned intサイズ(私の場合は 4 バイト)を考慮すると、たとえば、データがFE 45 78 D4 4C E9 EA F1etc の場合、ファイルの内容は etc と表示されますD4 78 45 FE F1 EA E9 4C。これを解決するにはどうすればよいですか? もう少し情報:バイトが間違った順序で書き込まれていると言うとき、ファイルを読み取るために使用するすべてのプログラムがバイトを間違った順序で表示し、もちろん読み取りエラーが発生することを意味します...なぜfwriteだけなのかわかりません関数はデータを表現するために別の方法を使用します...詳細情報:私は試しました

fwrite(myuipointer,4,size,file);

fwrite(myuipointer,1,size*4,file);

同じ結果です。また、データを指す unsigned char ポインターを使用して fwrite しようとしましたが、成功しませんでした...

4

5 に答える 5

4

これは、コンピュータがリトルエンディアンストレージ セマンティクスを使用しているためです。これは、数字の小さい方が最初に来ることを意味します。端が最初に来る数字を見るのに慣れています(たとえば340,000、千の桁が十の桁の前に来る場所)。

古い PowerPC Mac などのビッグ エンディアンシステムでデータが読み取られない場合は、この方法で数値を書き出すことができ、同じシステムで数値を読み込んで、正しい順序で並べ替えることができます。

このデータが異なるエンディアンを使用するシステム間で共有されることが予想される場合は、バイト オーダーを選択し、それに固執し、ファイルへの書き込み時にそのバイト オーダーとの間の変換を実行する必要があります。(あなたはエンディアンの概念を認識していないので、これは役に立たないと思います。)

于 2012-07-12T07:11:28.620 に答える
1

他の人は、回答でバイト順序の概念をカバーしており、これはリトルエンディアンのコンピューターで予想される動作です。

しかし、あなたの他の質問をいくつか見たところ、あなたは JPEG ファイルを扱っているようで、これが問題なのではないでしょうか?

JPEG ファイルは、リトル エンディアンとビッグ エンディアンだけでなく、32 ビットと 64 ビットなど、さまざまな種類のコンピューター間で移植可能である必要があります。したがって、JPEG は独自の標準サイズとバイト順を定義しており、(異なる場合) コンピュータの内部形式を JPEG 形式に変換する必要があります。fwrite が行うように、内部表現をファイルにダンプするだけでは、正しい JPEG 形式を期待するプログラムはすべて失敗します。

libjpegなどの無料の JPEG プログラムまたはライブラリのソース コードをダウンロードすると、fread と fwrite を使用するだけでなく、JPEG 標準に従って各バイトを読み書きするコードがあることがわかります。

于 2012-07-12T08:15:43.247 に答える
0

これは、コンピュータがデータのリトルエンディアン表現を使用しているために発生します。これは、整数などのデータが最下位バイトからメモリに格納されることを意味します。
あなたの番号は:

FE 45 78 D4
4C E9 EA F1

最下位バイトから始まるものは次のとおりです。

D4 78 45 FE
F1 EA E9 4C

データのビッグ エンディアン表現を使用するシステムでこのデータを読み取るときは注意が必要ですが、アプリケーションを使用するのが自分だけの場合、またはアプリケーションがリトル エンディアン システムでのみ使用されることが確実な場合は、それについて心配する必要はありません。

PS: これは、マシンがデータをどのように表現するかを正確に知る必要があるアセンブリで作業しているときに (たとえば) 整数の最後の 2 バイトを取得する必要がある場合にも問題になる可能性があります。

于 2012-07-12T07:52:21.507 に答える
0

リトルエンディアンとビッグエンディアンの数値を調べます。「ビッグ エンディアン」で格納された整数は (整数の) 最上位ビットが最初に格納され、「リトル エンディアン」で格納された整数は最下位ビットが最初に格納されます。

http://en.wikipedia.org/wiki/Endiannessを試してみてください- 技術的な記事をウィキペディアに頼るつもりはありませんが、簡単に説明します。

于 2012-07-12T07:11:03.523 に答える
0

これはバイト オーダーと呼ばれ、詳細を理解するには、それに関するウィキペディアの Web ページ (および、より一般的なコンピューター アーキテクチャに関するページ) を読む必要があります。一方、特定のデータを表す特定のバイト パターンを出力する場合は、unsigned char の配列を使用します。unsigned char の場合を除いて、構造体、配列、またはプリミティブ型をディスク ファイルに書き込むために移植可能に使用することはできませんfwrite(少なくとも、特定の出力パターンは期待できません)。

于 2012-07-12T07:11:47.483 に答える