3

データのバイト配列があり、クロスプラットフォームで一貫している必要があります。配列内のある場所を指すポインター、unsigned char* dataがあり、4バイトを変数に読み込みたいとします。私はこれだけができると思います:

uint32_t my_int = *data;

ただし、この方法ではエンディアンが考慮されていないことに気付きました。たとえば、データがビッグエンディアンの場合、一貫して読み取るためにこれを行う必要がありますか?

uint32_t my_int = (data[0] << 3) + (data[1] << 2) + (data[2] << 1) + data[3];

同様に、このデータをで書き込むときに同じチェックを行う必要がありfwriteますか?たとえば、同じデータを次のコードでファイルに書き込んだ場合:

fwrite(&my_int, sizeof(my_int), 1, fh);

結果のデータには既知のエンディアンがありますか?それとも、アーキテクチャに依存するのでしょうか?もしそうなら、これらの読み取りと書き込みを行い、すべてのプラットフォームで特定のエンディアンを強制する最も簡単な方法は何ですか?

4

3 に答える 3

3

バイナリ データを読み書きするときは常に、エンディアンを考慮する必要があります。構造体全体を読み書きしようとしている場合は、可変サイズとおそらく構造体のパッキングについても心配する必要があります。一部のアーキテクチャでは、奇数変数境界の整数も処理できないため、uint32_t myInteger = *(uint32_t*)bufferPtr++ などを使用して、バイナリ バッファーから直接整数を取得することはできません。

これを機能させるには、あらゆる種類の方法があります。昔は、速度と RAM の使用が大きな問題でした。ファイルからデータのチャンクを直接バッファに読み込み、必要に応じて構造体へのポインタを使用してエンディアンをその場で修正していました。

現在でもそれを行うことができますが、コンパイラ間の構造体のパッキングの違いにより面倒になるため、次のような特定の型の単純な i/o ルーチンを作成する方が理にかなっている場合があります。

int write_integer_at_position( FILE *, size_t position, uint32_t );
int read_integer_from_position( FILE *, size_t position, uint32_t *outResult );
etc

これらのルーチンは、必要に応じて、おそらく htonl を使用して、データの読み取り後またはディスクへの書き込み前にバイトをスワップします。これを 20 ~ 30 回実行すると、RAM 内の構造とファイルの間をマップする何らかのデータ記述言語を書きたくなるでしょう。多くの人がやっていますが、特に誰も本当に普及しているとは思いません。

于 2013-02-16T05:02:11.577 に答える
1

これらは、データがアプリケーションに出入りするときに直面する典型的な問題です。データのプロデューサーとコンシューマーが単なるアプリケーションである場合、それはそれほど問題ではありません。

ただし、EricS が言及しているように、このデータを消費または生成する他のアプリケーションがあり、それらが異なるプラットフォーム/言語/フレームワーク上にある場合、シリアル化または逆シリアル化のバイト順序は間違いなく重要になります。

ネットワーク順序は、IP ベースのプロトコルで使用される事実上の標準の一種です。ホストからネットワークへ、およびネットワークからホストへの順序を変換できるライブラリ関数があります (Ed Heal が提供するリンクを参照してください)。

バイト順とは別に、プロトコルとプラットフォームに基づいて、最上位ビットまたは最下位ビットのいずれかがネットワーク上で最初にプッシュされる可能性があるため、ビット順も確認する必要があります。

構造体のパッキング、型 (整数、文字列、文字) の表現、そのサイズなども考慮する必要がある場合があります。

于 2013-02-16T06:09:07.120 に答える
1

整数を使用する場合、関数/マクロのファミリがあります

見る

たとえば、ntol

パッキングに関しては、プロトコルと物を配置する場所を定義するだけです。次に write could を使用して、さまざまなビットが正しい位置にある文字配列を作成します。これは、これらの詳細を取得するコードに対応している必要があります。

于 2013-02-16T05:15:06.063 に答える