3

两个引用:

协议中所有剩余的消息都采用<length prefix><message ID><payload>. 长度前缀是一个四字节大端值。消息 ID 是一个十进制字节。有效负载取决于消息。

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

请求消息是固定长度的,用于请求一个块。有效载荷包含以下信息:

  • index:整数,指定从零开始的片段索引
  • begin:整数,指定片段内从零开始的字节偏移量
  • 长度:指定请求长度的整数。

当我写下所有内容时,它总计为 5 个字节。使用

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

message = byteStream.toByteArray();

编辑:对不起,我写的时候有点生气。它的bittorent协议。使用这个规范

4

4 回答 4

6

write() 方法写入一个字节。

如果你给它发送一个 char 或 int,它只会用 & 0xFF 去除第 8 位以上的所有内容。

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><length>+5,具体取决于具体<length>含义。第二个引用看起来像是由 0x06 的 1 字节标识符标识的任何消息的定义。我猜想:

  1. 有效载荷,即组成的字节,<index><begin><length>可能有 14 个字节长
  2. 长度以十六进制显示,所以 0x0013 是十进制的 19

无论如何,您生成的字节流似乎与消息定义不匹配并且消息定义缺乏清晰度。

于 2009-06-25T21:30:48.627 回答
1

write() 写入字节。5 个 write() 产生 5 个字节。

于 2009-06-25T21:25:25.847 回答
1

write(int b)

将指定字节写入此输出流。写入的一般约定是将一个字节写入输出流。要写入的字节是参数 b 的 8 个低位。b 的高 24 位被忽略。

的子类 OutputStream必须为此方法提供实现。

参数: b - 字节。

于 2009-06-25T21:29:43.153 回答