Como este é 13 bytes de comprimento?
-
20-08-2019 - |
Pergunta
Duas citações:
Todas as mensagens restantes no protocolo de assumir a forma de
<length prefix><message ID><payload>
. O prefixo comprimento é um valor grande-endian quatro bytes. O ID da mensagem é um único byte decimal. A carga útil é dependente mensagem.request: <len=0013><id=6><index><begin><length>
A mensagem de pedido é fixo comprimento, e é usado para solicitar um bloco. A carga útil contém as seguintes informações:
- index: integer especificando o baseado em zero índice peça
- começar: inteiro que especifica o byte deslocamento baseado em zero dentro da peça
- comprimento: inteiro que especifica o comprimento desejado.
Quando eu escrever tudo isso resume a 5 bytes. Usando
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byteStream.write( 13 );
byteStream.write( 6 );
byteStream.write( index );
byteStream.write( begin );
byteStream.write( length );
message = byteStream.toByteArray();
EDIT: Desculpe eu estava tipo de chateado quando eu o escrevi. sua bittorent o protocolo. Usando este especificação .
Solução
O método write () escreve um byte.
Se você enviá-lo um char ou int ele só retira tudo acima da 8ª pouco com & 0xFF.
Você tem mais opções com DataOutputStream (writeInt, writeShort etc.), mas ele usa a ordem grande byte endian então você pode precisar de realizar uma Integer.reverseBytes () (ou Short.reverseBytes ()) chamada antes de passar no valor de o método 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();
Observação: A especificação não indica o comprimento do index
, begin
e length
. Eu só queria dar uma amostra das opções disponíveis.
Editar 2: Editado a amostra com base na resposta do D.Shawley e uma especificação encontrados aqui .
Outras dicas
Eu não sei o que você está chegando aqui ... o texto citado não diz o que o comprimento do <index>
, <begin>
, ou <length>
é. Os primeiros citações estados, de modo bastante claro, que uma mensagem consiste de um comprimento de 4 bytes, seguida por um identificador de um-byte e uma carga útil arbitrária.
O comprimento da carga útil é provavelmente seja o valor especificado como <length>
ou <length>
+ 5 dependendo exatamente o que significa <length>
. A segunda citação parece que a definição de qualquer mensagem é identificado pelo identificador de 1 byte de 0x06. Eu diria que:
- a carga, os bytes que compõem
<index><begin><length>
, é provavelmente 14 bytes de comprimento - o comprimento está a ser exibido em hexadecimal assim 0x0013 é 19 decimal
Em qualquer caso, o fluxo de bytes que você está gerando não parece corresponder à definição de mensagem E a definição de mensagem carece de clareza.
write () escreve bytes. 5 write () é produz 5 bytes.
Grava o byte especificado para esta fluxo de saída. O contrato geral para escrever é que um byte é escrito para o fluxo de saída. O byte a ser São escritos a oito bits de baixa ordem de o argumento b. Os 24 bits de alta ordem de b são ignorados.
As subclasses de
OutputStream
deve fornecer um implementação para este método.Parâmetros: b -. byte