Какова длина этого 13 байт?
-
20-08-2019 - |
Вопрос
Две цитаты:
Все остальные сообщения в протоколе принимают форму
<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.Я бы предположил, что:
- полезная нагрузка, байты, которые составляют
<index><begin><length>
, вероятно , имеет длину 14 байт - длина отображается в шестнадцатеричном формате, поэтому 0x0013 равен 19 десятичным числам
В любом случае генерируемый вами поток байтов, похоже, не соответствует определению сообщения И определению сообщения не хватает ясности.
write() записывает байты.5 функция write() выдает 5 байт.
Видишь write(int b)
.
Записывает указанный байт в этот выходной поток.Общий контракт для записи заключается в том, что записывается один байт в выходной поток.Байт, который должен быть записан, - это восемь младших битов аргумента b.24 бита старшего порядка из b игнорируются.
Подклассы
OutputStream
должен предоставить реализацию для этого метода.Параметры:b - байт.