Вопрос

Две цитаты:

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

request: <len=0013><id=6><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, он просто удаляет все, что выше 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: Отредактировал образец на основе ответа Д.Шоули и найденной спецификации здесь.

Другие советы

Я не совсем уверен, к чему вы здесь клоните...в процитированном тексте не говорится, какова длина <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.24 бита старшего порядка из b игнорируются.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top