2

Cap'n Proto メッセージを C++ から Java に送信するために TCP クライアント/サーバーを使用しています。

場合によっては、受信バッファがいっぱいになったり、いっぱいになったりすることがあります。これらのケースを処理するには、メッセージ サイズを知る必要があります。

Javaでバッファのサイズを確認すると、208バイトになりますが、

MyModel.MyMessage.STRUCT_SIZE.total()

4 を返します (ここで使用されている単位は不明です)。

4 は 208 を 52 回割ることに気付きました。しかし、52 を使用した重要な変換係数については知りません。

Javaでメッセージサイズを確認するにはどうすればよいですか?

4

1 に答える 1

2

MyMessage.STRUCT_SIZEその構造体自体の一定サイズ (8 バイトの単語で測定) を表しますが、構造体に重要なフィールド (テキスト、データ、リスト、またはその他の構造体など) が含まれている場合、それらもスペースを占有し、スペースの量それらが取るのは一定ではありません(たとえば、テキストは文字列の長さに応じてスペースを取ります)。

通常、Cap'n Proto が適切な s に直接書き込み/読み取りできるByteChannelようにして、自分でサイズを追跡する必要がないようにする必要があります。ただし、事前にメッセージのサイズを本当に計算する必要がある場合は、次のような方法で計算できます。

ByteBuffer[] segments = message.getSegmentsForOutput();
int total = (segments.length / 2 + 1) * 8;  // segment table
for (ByteBuffer segment: segments) {
  total += segment.remaining();
}
// now `total` is the total number of bytes that will be
// written when the message is serialized.

capnp::computeSerializedSizeInWords()C++ サイズでは、 from serialize.h(および 8 倍) を使用できます。

org.capnproto.Serializeしかし繰り返しになりますが、ストリーミング I/Oのメソッドを使用して、これを回避するようにコードを構成する必要があります。

于 2015-08-15T23:06:35.740 に答える