2016-04-04 3 views
0

私は、バッファ内のベクトルのサイズを前にしたいと思います。しかし、私はサイズのタイプが何であるかを正確には知らない。結局、std :: size_tは固定サイズにすることはできません。私の考えでは、代わりにuint64_tを使うつもりです。バッファは次のようになります:TCPバッファにベクトル<int32_t>をシリアル化していますか?

8 bytes length | 4 bytes element1 | 4 bytes element2 | ... | 

ここで、uint64_tはstd :: size_tを意味するものではありません。どんな良いアイデアも高く評価されます。

+1

私はあなたが求めているものを理解していません。特定のエンディアンまたはフォーマットでサイズをエンコードするために4バイトまたは8バイトなどを使用する場合は、それを行います。問題は何ですか? 'size_t'を使ってサイズを保持することができます。サイズを保持できるのであれば、どのような型を使用するのですか? –

+0

また、ポータブルであるためには、予測可能なエンディアンが得られるようにしてください。ソケット上で送信する前に、32ビットエンティティにhtonl()を使用してください。 –

+0

@David Schwartz質問は、私はベクトルのサイズがわからないということです。私はそのサイズを保持するためにuint64_t変数を使用するだけで、この変数をバッファに書き込むことはできません。 – NiklausTseng

答えて

1

使用している値を保持できる限り、任意のタイプを使用できます。それは既にsize_tなので、そのままにしておいてください。値を表すために使用するバイト数と各バイトが必要な値を決定し、各バイトを正しくエンコード/デコードするコードを作成します。

+0

私は、「これはひどい考えです。あなたのsize_tはおそらく64ビットです。私の小さなARMプロセッサのsize_tは32ビットです.16ビットのsize_tのデバイスを手に入れることができると思います」しかし、私は誤解しました。あなたは "size_tを使用しますが、TCPバッファに保存するときは8オクテットとしてエンコードします(そして、size_tが32ビットの場合、オクテットのうち4つは必然的にゼロになります)"。 - 同意。 –

1

あなたはほぼそこにいます。現在のプラットフォームでは64ビットを超えるsize_tが使用されていません(実験用の100TBitファイバーで64ビットのint32を転送するには数日かかるでしょう)。手順は次のとおりです。

  1. const uint64_t len = vec.length();
  2. は、定義された順序であなたのTCPバッファに8つのバイトを書き込みます。
  3. 各intの4バイトを定義された順序でtcpバッファに書き込みます。
  4. を送信します。

最後の2つの手順が千以上のいくつかの要素のためのループである必要があることに注意してください。..

関連する問題