3

2つの引用符:

プロトコルの残りのメッセージはすべて、の形式を取ります<length prefix><message ID><payload>。長さプレフィックスは4バイトのビッグエンディアン値です。メッセージIDは10進数の1バイトです。ペイロードはメッセージに依存します。

request: <len=0013><id=6><index><begin><length> 

要求メッセージは固定長であり、ブロックを要求するために使用されます。ペイロードには次の情報が含まれています。

  • index:ゼロベースのピースインデックスを指定する整数
  • begin:ピース内のゼロベースのバイトオフセットを指定する整数
  • length:要求された長さを指定する整数。

私がすべてを書くとき、それは合計で5バイトになります。使用する

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byteStream.write( 13 );
byteStream.write( 6 );
byteStream.write( index );
byteStream.write( begin );
byteStream.write( length );

message = byteStream.toByteArray();

編集:申し訳ありませんが、私がそれを書いたとき、私はちょっと腹を立てていました。その苦いプロトコル。この仕様を使用します。

4

4 に答える 4

6

write() メソッドは 1 バイトを書き込みます。

char または int を送信すると、8 番目のビットより上のすべてが & 0xFF で取り除かれます。

DataOutputStream (writeInt、writeShort など) にはより多くのオプションがありますが、ビッグ エンディアンのバイト オーダーを使用するため、値を writeXYZ( ) 方法。

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();

DataOutputStream dout = new DataOutputStream(byteStream);

dout.writeInt( 0x13 ); // L:4
dout.write( 6 ); // L:5
dout.writeShort( index ); // guess, L:7
dout.writeLong( begin ); // >4GB support? L:15
dout.writeInt( length ); // clients accept below to 2^17, L:19

dout.flush(); // to be sure

message = byteStream.toByteArray();

index注: 仕様には、 、beginおよびの長さは記載されていませんlength。利用可能なオプションのサンプルを提供したかっただけです。

編集 2: D.Shawley の回答とここにある仕様に基づいてサンプルを編集しました。

于 2009-06-25T21:26:03.550 に答える
2

あなたがここで何を得ているのかわかりません...引用されたテキストは<index>、 、<begin>、またはの長さを示していません<length>。最初の引用では、メッセージが 4 バイトの長さ、その後に続く 1 バイトの識別子、および任意のペイロードで構成されていることをかなり明確に述べています。

ペイロードの長さは、正確な意味に応じて、指定された値<length>または+5 のいずれかになります。2 番目の引用符は、0x06 の 1 バイトの識別子によって識別されるメッセージの定義のように見えます。私はそれを推測します:<length><length>

  1. を構成するバイトであるペイロードは、<index><begin><length>おそらく 14 バイトの長さです。
  2. 長さは 16 進数で表示されているため、0x0013 は 10 進数の 19 です

いずれにせよ、生成しているバイト ストリームはメッセージ定義と一致していないようであり、メッセージ定義は明確ではありません。

于 2009-06-25T21:30:48.627 に答える
1

write() はバイトを書き込みます。5 回の write() で 5 バイトが生成されます。

于 2009-06-25T21:25:25.847 に答える
1

を参照してくださいwrite(int b)

指定されたバイトをこの出力ストリームに書き込みます。書き込みの一般契約では、1 バイトが出力ストリームに書き込まれます。書き込むバイトは、引数 b の下位 8 ビットです。b の上位 24 ビットは無視されます。

のサブクラスは OutputStream、このメソッドの実装を提供する必要があります。

パラメータ: b - バイト。

于 2009-06-25T21:29:43.153 に答える