这13个字节有多长?

时间:2009-06-25 21:18:21

标签: java byte bytearrayoutputstream

两个引号:

  

协议中的所有剩余消息都采用<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

4 个答案:

答案 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();

备注:规范未说明indexbeginlength的长度。我只想提供可用选项的样本。

编辑2:根据D.Shawley的回答和找到的here规范编辑了示例。

答案 1 :(得分:2)

我不确定你在这里得到什么......引用的文字没有说明<index><begin><length>的长度是多少。第一个引用相当清楚地表明消息包含4字节长度,后跟1字节标识符和任意有效负载。

有效负载的长度可能是指定为<length><length> + 5的值,具体取决于<length>的含义。第二个引用看起来像是由1字节标识符0x06标识的任何消息的定义。我猜是这样的:

  1. 有效负载,即组成<index><begin><length>的字节,可能长达14个字节
  2. 长度以十六进制显示,因此0x0013为十进制19
  3. 在任何情况下,您生成的字节流似乎与消息定义 AND 不匹配,消息定义缺乏明确性。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

请参阅write(int b)

  

将指定的字节写入此字节   输出流。一般合同   写入是写入一个字节   到输出流。字节是   写的是八个低位   论证b。 24个高阶位   b被忽略了。

     

的子类   OutputStream必须提供   这种方法的实现。

     

参数:       b - 字节。