4

注:これは以前に何度も尋ねられたことを知っていますが、どの質問にも、具体的で移植可能な、維持されているライブラリへのリンクがありませんでした。

pack/unpack関数のような Python/Ruby/Perl を実装する C または C++ ライブラリが必要です。そのようなライブラリは存在しますか?

編集: 送信するデータは単純なので、memcpy、ポインター、およびhton*関数のみを使用することにしました。charプラットフォームに依存しない方法でネットワーク経由で送信するには、何らかの方法でa を操作する必要がありますか? ( はchar、文字としてではなく、バイトとしてのみ使用されます)。

4

3 に答える 3

6

C/C++ では通常、さまざまなメンバーを正しい順序で記述し(正しいパッキングにはコンパイラ固有のプラグマが必要になる場合があります)、生の/ (またはC++ ストリームを処理する場合は/ struct) を使用してファイルにダンプ/ファイルから読み取ります。. 実際、このメソッドで生成されたものを読み取るために生まれました。fwritefreadreadwritepackunpack

ファイルではなくバッファに結果が必要な場合は、さらに簡単です。構造をバッファにコピーするだけmemcpyです.

表現が移植可能でなければならない場合、主な関心事はバイト順とフィールド パッキングです。最初の問題はさまざまな関数で解決できますがhton*、2 番目の問題はコンパイラ固有のディレクティブで解決できます。

特に、多くのコンパイラは#pragma packディレクティブ ( VC++ についてはこちら、gcc についてはこちらを参照) をサポートしています。これにより、コンパイラがフィールドを便利な境界に揃えるために挿入する可能性のある (不要な) パディングを管理できます。struct

memcpyただし、一部のアーキテクチャでは、特定の型のフィールドが自然な境界で整列されていない場合、それらのフィールドへのアクセスが許可されていないことに注意してください。そのため、これらの場合、生のバイトを変数にコピーするために手動で s を実行する必要があるでしょう。正しく整列されています。

于 2012-03-02T00:08:39.503 に答える
5

シリアル化またはプロトコルバッファをブーストしてみませんか?

于 2012-03-02T04:23:29.233 に答える
2

はい: std::copyfromを使用し<algorithm>て、変数のバイト表現を操作します。すべての変数は、;T x;を介してバイト配列としてアクセスできます。char * p = reinterpret_cast<char*>(&x)配列の最初の要素へのポインタのようにp扱うことができますchar[sizeof(T)]。例えば:

char buf[100];
double q = get_value();

char const * const p = reinterpret_cast<char const *>(&q);
std::copy(p, p + sizeof(double), buf);

// more stuff like that

some_stream.write(buf) //... etc.

そして戻るには:

double r;

std::copy(data, data + sizeof(double), reinterpret_cast<char *>(&r));

要するに、C++ では専用のpack/は必要ありませんunpack。言語では、言語の標準部分として変数のバイナリ表現にアクセスできるためです。

于 2012-03-02T00:06:48.810 に答える