两个行情:

剩余的所有信息的协议采取的形式 <length prefix><message ID><payload>.长前缀是四个字节big-endian值。消息ID是一个小数字节。有效载荷是消息的依赖。

request: <len=0013><id=6><index><begin><length> 

所请求的信息是固定长度,而是使用的要求的一块。该有效载荷包含以下信息:

  • 指标:整数指定的基于零件的索引
  • 开始:整数指定零-based byte offset内的片
  • 长度:整数指定的请求的长度。

当我把一切都写它总结了5个字节。使用

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byteStream.write( 13 );
byteStream.write( 6 );
byteStream.write( index );
byteStream.write( begin );
byteStream.write( length );

message = byteStream.toByteArray();

编辑:对不起我是那种生气的时候我写的。其bittorent协议。使用这个 规格.

有帮助吗?

解决方案

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

如果你向它发送一个char或int它只是条的一切上述第8位与&0xFF。

你有更多的选择与DataOutputStream(writeInt,writeShort等)。 但是它使用big endian byte order所以,你可能需要执行一整数。reverseBytes()(或短。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, beginlength.我只是想给一样的可供选择。

编辑2: 编辑的样品的基础上D.Shawley的答复和规范的发现 在这里,.

其他提示

我不知道什么你在这里...所引述的文本并没有说什么的长度 <index>, <begin>, 或 <length> 是。第一的报价国家,而是清楚的,这一消息由一个4-字节的长度,接着1字节的标识符,以及任意的有效载荷。

有效载荷的长度,是可能的价值指定为 <length><length>+5取决于究竟是什么 <length> 装置。第二次报看起来像定义的任何消息认定,由1个字节的标识符的0x06。我猜想是:

  1. 有效载荷,字节了 <index><begin><length>, 可能是14个字节
  2. 长正在显示在六使0x0013是19个小数

在任何情况下,字节流那你是产生似乎并不相匹配的信息定义 信息定义中缺乏清晰度。

write()写字节。5write()'s产生的5个字节。

看看 write(int b).

写入指定的字节到这个 输出流。一般的合同 写的是,一个字是写 输出流。字节是 写的是八低单位的 该论点b。24高位了 b被忽略。

亚类的 OutputStream 必须提供一个 执行这种方法。

参数:b字节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top