[英]How is this 13 bytes long?
两个引号:
协议中的所有剩余消息采用
<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协议。 使用此规范 。
write()方法写入一个字节。
如果你发送一个char或int它只是用&0xFF剥离第8位以上的所有内容。
DataOutputStream(writeInt,writeShort等)有更多选项,但它使用大端字节顺序,因此您可能需要在将值传递给writeXYZ之前执行Integer.reverseBytes()(或Short.reverseBytes())调用( ) 方法。
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的答案和此处的规范编辑样本。
我不确定你在这里得到什么...引用的文字没有说明<index>
, <begin>
或<length>
的长度是多少。 第一个引用相当清楚地表明消息由4字节长度,后跟1字节标识符和任意有效负载组成。
有效负载的长度可能是指定为<length>
或<length>
+5的值,具体取决于<length>
含义。 第二个引用看起来像是由1字节标识符0x06标识的任何消息的定义。 我猜是这样的:
<index><begin><length>
字节大概是14个字节长 在任何情况下,您生成的字节流似乎与消息定义不匹配,并且消息定义缺乏清晰度。
write()写入字节。 5 write()产生5个字节。
见write(int b)
。
将指定的字节写入此输出流。 写入的一般合同是将一个字节写入输出流。 要写入的字节是参数b的八个低位。 b的24个高位被忽略。
OutputStream
子类必须为此方法提供实现。参数:b - 字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.