Какова длина этого 13 байтов? - PullRequest
3 голосов
/ 26 июня 2009

Две цитаты:

Все остальные сообщения в протоколе имеют вид <length prefix><message ID><payload>. Префикс длины - это четырехбайтовое значение с прямым порядком байтов. Идентификатор сообщения представляет собой один десятичный байт. Полезная нагрузка зависит от сообщения.

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

Сообщение запроса имеет фиксированную длину и используется для запроса блока. Полезная нагрузка содержит следующую информацию:

  • index: целое число, указывающее индекс фрагмента, начинающийся с нуля
  • begin: целое число, указывающее смещение байтов на основе нуля внутри куска
  • длина: целое число, указывающее запрашиваемую длину.

Когда я пишу все, это суммирует до 5 байтов. Использование

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

message = byteStream.toByteArray();

РЕДАКТИРОВАТЬ: Извините, я был немного зол, когда я написал это. это протокол bittorent. Используя это spec .

Ответы [ 4 ]

6 голосов
/ 26 июня 2009

Метод write () записывает один байт.

Если вы отправите ему символ или int, он просто удалит все, что выше 8-го бита, с & 0xFF.

У вас есть больше опций с DataOutputStream (writeInt, writeShort и т. Д.), Но он использует порядок байтов с прямым порядком байтов, поэтому вам может потребоваться выполнить вызов Integer.reverseBytes () (или Short.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, begin и length. Я просто хотел дать образец доступных опций.

Редактировать 2: Отредактировал образец на основе ответа Д. Шоули и найденной спецификации здесь .

2 голосов
/ 26 июня 2009

Я не уверен, что вы получаете здесь ... цитируемый текст не говорит, что длина <index>, <begin> или <length>. Первая цитата довольно ясно заявляет, что сообщение состоит из 4-байтовой длины, за которой следует 1-байтовый идентификатор и произвольная полезная нагрузка.

Длина полезной нагрузки может быть либо значением, указанным как <length>, либо <length> + 5, в зависимости от того, что именно означает <length>. Вторая цитата выглядит как определение любого сообщения, идентифицируемого 1-байтовым идентификатором 0x06. Я думаю, что:

  1. полезная нагрузка, байты, составляющие <index><begin><length>, вероятно, имеет длину 14 байтов
  2. длина отображается в шестнадцатеричном формате, поэтому 0x0013 - это 19 десятичных знаков

В любом случае генерируемый поток байтов не соответствует определению сообщения И определению сообщения не хватает ясности.

1 голос
/ 26 июня 2009

См. write(int b).

Записывает указанный байт в этот выходной поток. Генеральный договор для записи является то, что один байт записан в выходной поток. Байт должен быть написано восемь младших битов аргумент б. 24 старших разряда б игнорируются.

Подклассы OutputStream должен предоставить реализация для этого метода.

Параметры: б - байт.

1 голос
/ 26 июня 2009

write () записывает байты. 5 write () выдает 5 байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...