这13个字节有多长?

Ham*_*aya 3 java byte bytearrayoutputstream

两个引号:

协议中的所有剩余消息都采用以下形式<length prefix><message ID><payload>.长度前缀是一个四字节的大端值.消息ID是单个十进制字节.有效负载取决于消息.

request: <len=0013><id=6><index><begin><length> 
Run Code Online (Sandbox Code Playgroud)

请求消息是固定长度的,用于请求块.有效负载包含以下信息:

  • 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();
Run Code Online (Sandbox Code Playgroud)

编辑:对不起我写的时候有点生气.它的bittorent协议.使用此规范.

aka*_*okd 6

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();
Run Code Online (Sandbox Code Playgroud)

备注:该规范没有规定的长度index,beginlength.我只想提供可用选项的示例.

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