这13个字节长是多少?

发布于 2024-07-25 22:34:27 字数 931 浏览 7 评论 0 原文

两句话:

协议中的所有剩余消息均采用<长度前缀><消息ID><有效负载> 的形式。 长度前缀是一个四字节大端值。 消息 ID 是一个十进制字节。 有效负载取决于消息。

请求:  
  

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

  • 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();

编辑:抱歉,当我写它时,我有点生气。 它是比特流协议。 使用此规范

Two quotes:

All of the remaining messages in the protocol take the form of <length prefix><message ID><payload>. The length prefix is a four byte big-endian value. The message ID is a single decimal byte. The payload is message dependent.

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

The request message is fixed length, and is used to request a block.
The payload contains the following information:

  • index: integer specifying the zero-based piece index
  • begin: integer specifying the zero-based byte offset within the piece
  • length: integer specifying the requested length.

When I write everything it sums up to 5 bytes. Using

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

message = byteStream.toByteArray();

EDIT: Sorry i was kind of pissed when i wrote it. its the bittorent protocol.
Using this spec.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

や莫失莫忘 2024-08-01 22:34:27

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

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

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

备注:规范中没有规定 indexbeginlength 的长度。 我只是想提供可用选项的示例。

编辑2:根据 D.Shawley 的答案和找到的规范编辑示例此处

The write() method writes one byte.

If you send it a char or int it just strips everything above the 8th bit with & 0xFF.

You have more options with DataOutputStream (writeInt, writeShort etc.) but it uses big endian byte order so you might need to perform an Integer.reverseBytes() (or Short.reverseBytes()) call before passing in the value to the writeXYZ() method.

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

Remark: The spec doesn't state the length of index, begin and length. I just wanted to give a sample of the available options.

Edit 2: Edited the sample based on D.Shawley's answer and a spec found here.

撩人痒 2024-08-01 22:34:27

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

有效负载的长度可能是 指定的值或 +5,具体取决于 代码> 的意思。 第二个引号看起来像是由 1 字节标识符 0x06 标识的任何消息的定义。 我猜测:

  1. 有效负载,即组成 的字节,可能有 14 个字节长,
  2. 长度以十六进制显示,因此 0x0013 是十进制的 19

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

I'm not sure what you are getting at here... the quoted text doesn't say what the length of <index>, <begin>, or <length> is. The first quote states, rather clearly, that a message consists of a 4-byte length, followed by a 1-byte identifier, and an arbitrary payload.

The length of the payload is probably either the value specified as <length> or <length>+5 depending on exactly what <length> means. The second quote looks like the definition of whatever message is identified by the 1-byte identifier of 0x06. I would guess that:

  1. the payload, the bytes that make up <index><begin><length>, is probably 14 bytes long
  2. the length is being displayed in hex so 0x0013 is 19 decimal

In any case, the byte stream that you are generating does not seem to match the message definition AND the message definition lacks clarity.

感性不性感 2024-08-01 22:34:27

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

write() writes bytes. 5 write()'s produces 5 bytes.

心如狂蝶 2024-08-01 22:34:27

请参阅 写(int b)

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

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

参数:
b - 字节。

See write(int b).

Writes the specified byte to this
output stream. The general contract
for write is that one byte is written
to the output stream. The byte to be
written is the eight low-order bits of
the argument b. The 24 high-order bits
of b are ignored.

Subclasses of
OutputStream must provide an
implementation for this method.

Parameters:
b - the byte.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文