繁体   English   中英

这13个字节有多长?

[英]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的长度, beginlength 我只想提供可用选项的示例。

编辑2:根据D.Shawley的答案和此处的规范编辑样本。

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

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

  1. 有效载荷,构成<index><begin><length>字节大概是14个字节长
  2. 长度以十六进制显示,因此0x0013是十进制的19

在任何情况下,您生成的字节流似乎与消息定义不匹配并且消息定义缺乏清晰度。

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

write(int b)

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

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

参数:b - 字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM