簡體   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