c - Cのファイルから数値を読み取る

原文 c file byte

私は主にPythonプログラマーですが、Pythonはグラフィック(20 fps移動フラクタルFTW)には遅すぎるため、Cを使用しています。でも私はこだわりを感じています...
テスト用に16進エディターで小さなファイルを書きました。最初のバイト5Aを読み取ろうとすると、次のようなプログラムで正しく90が得られます...

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned char number;
    fread(&number,1,1,data);
    printf("%d\n",number);
}


しかし、最初の4バイト5A F3 5B 20を整数に読み込もうとすると、542896986になります。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *data;
int main(int argc, char* argv[])
{
    data=fopen("C:\\vb\\svotest1.vipc","r+b");
    unsigned long number;
    fread(&number,1,4,data);
    printf("%d\n",number);
}


1525898016である必要があります!!!
問題は、バイト順が逆になっていることです。 GAH!もちろん!このプログラムの動作は、マシンによって異なります。そして今、私たちが問題になっているので、バイトでさえすべてのマシンで機能するわけではありません!

だから私は助けが必要です... Pythonではstruct.packとstruct.unpackを使用して、任意の形式(ロング、ショート、シングル、ダブル、符号付き、符号なし、ビッグエンディアン、リトルエンディアン)でデータをバイトにパックし、それをアンパックできます。 Cでこのようなものが必要です...自分で書くこともできますが、方法がわかりません。
答え
これを移植可能に処理する最も簡単な方法は、ファイルに書き込む前にデータにhtonlを使用して(ファイルがネットワーク/ビッグエンディアンの順序になるようにする)、読み取るときに(ネットワークオーダーデータを変換する)ntohlを使用することです。地元の慣習に、それが何であれ)。

1つのタイプのいくつかの値よりもはるかに多くの値を実行する必要がある場合は、Sun XDRやGoogle Protocol Buffersなどの目的で、より完全なライブラリを調べることができます。
関連記事

c - すでに印刷されている改行を削除するVT100エスケープシーケンス?

c - 独自のベーシックディスクスキャナーを作成する方法

c++ - 警告—ポインターと組み合わせた算術式の不審な切り捨て

c++ - GMP整数をベースN整数に変換する

c++ - GTKでキーボードとマウスの入力を取得するにはどうすればよいですか?

c - $ PATHのディレクトリをリストまたは配列として取得する方法は?

c - sedを使用した複数行構造の検出と連結

c - Windowsスリム読み取り/書き込みロックの使用

c - 古いgccコンパイラの__sync_val_compare_and_swap関数の代替

php - PHPを使用してCプログラムからの入力を処理する方法