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 .

Foi útil?

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:

  1. a carga, os bytes que compõem <index><begin><length>, é provavelmente 14 bytes de comprimento
  2. 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.

write(int b) .

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top