两个引号:
协议中的所有剩余消息都采用
<length prefix><message ID><payload>
的形式。长度前缀是一个四字节的大端值。消息ID是单个十进制字节。有效负载取决于消息。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();
编辑:对不起我写这篇文章的时候有点生气。它的bittorent协议。
使用此spec。
答案 0 :(得分:6)
write()方法写入一个字节。
如果你发送一个char或int它只是将第8位以上的所有内容用&amp; 0xFF的。
DataOutputStream(writeInt,writeShort等)有更多选项,但它使用大端字节顺序,所以你可能需要在传入值之前执行Integer.reverseBytes()(或Short.reverseBytes())调用。 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的回答和找到的here规范编辑了示例。
答案 1 :(得分:2)
我不确定你在这里得到什么......引用的文字没有说明<index>
,<begin>
或<length>
的长度是多少。第一个引用相当清楚地表明消息包含4字节长度,后跟1字节标识符和任意有效负载。
有效负载的长度可能是指定为<length>
或<length>
+ 5的值,具体取决于<length>
的含义。第二个引用看起来像是由1字节标识符0x06标识的任何消息的定义。我猜是这样的:
<index><begin><length>
的字节,可能长达14个字节在任何情况下,您生成的字节流似乎与消息定义 AND 不匹配,消息定义缺乏明确性。
答案 2 :(得分:1)
write()写入字节。 5 write()产生5个字节。
答案 3 :(得分:1)
请参阅write(int b)
。
将指定的字节写入此字节 输出流。一般合同 写入是写入一个字节 到输出流。字节是 写的是八个低位 论证b。 24个高阶位 b被忽略了。
的子类
OutputStream
必须提供 这种方法的实现。参数: b - 字节。