【问题标题】:How is this 13 bytes long?这 13 个字节有多长?
【发布时间】:2009-06-25 21:18:21
【问题描述】:

两个引号:

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

【问题讨论】:

  • 什么是索引、开始和长度?如果三个变量是 char 或 byte,那么每个 write(..) 调用看起来都是一个字节 - 所以是 5 个字节。

标签: java byte bytearrayoutputstream


【解决方案1】:

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

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

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 编辑示例。

【讨论】:

  • 在 OP 中,他说他也在使用 big-endian。
【解决方案2】:

我不确定你在这里得到什么......引用的文字没有说明&lt;index&gt;&lt;begin&gt;&lt;length&gt; 的长度是多少。第一个引用非常清楚地表明,一条消息由 4 字节长度、后跟 1 字节标识符和任意有效负载组成。

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

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

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

【讨论】:

  • 我认为这句话是在描述某个网络上的二进制协议。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    write(int b)

    将指定的字节写入此 输出流。一般合同 for write 是写入一个字节 到输出流。要成为的字节 写的是八个低位 论据 b。 24 个高位 的 b 被忽略。

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

    参数: b - 字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      相关资源
      最近更新 更多