Domanda

Due virgolette:

  

Tutti i messaggi rimanenti nel protocollo assumono la forma di <length prefix><message ID><payload>. Il prefisso di lunghezza è un valore big-endian a quattro byte. L'ID messaggio è un singolo byte decimale. Il payload dipende dal messaggio.

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

Il messaggio di richiesta ha una lunghezza fissa e viene utilizzato per richiedere un blocco.   Il payload contiene le seguenti informazioni:

     
      
  • indice: numero intero che specifica l'indice pezzo basato su zero
  •   
  • inizio: numero intero che specifica l'offset di byte in base zero all'interno del pezzo
  •   
  • lunghezza: numero intero che specifica la lunghezza richiesta.
  •   

Quando scrivo tutto, somma fino a 5 byte. Utilizzando

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

message = byteStream.toByteArray();

EDIT: mi dispiace che ero un po 'incazzato quando l'ho scritto. è il protocollo bittorent. Utilizzando questa spec .

È stato utile?

Soluzione

Il metodo write () scrive un byte.

Se gli invii un carattere o int, esso rimuove semplicemente tutto sopra l'ottavo bit con l'amplificatore &; 0xFF.

Hai più opzioni con DataOutputStream (writeInt, writeShort ecc.) ma utilizza un grande ordine di byte endian, quindi potresti dover eseguire una chiamata Integer.reverseBytes () (o Short.reverseBytes ()) prima di passare il valore a il metodo 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();

Nota: le specifiche non indicano la lunghezza di index, begin e length. Volevo solo fornire un campione delle opzioni disponibili.

Modifica 2: modificato l'esempio in base alla risposta di D.Shawley e trovata una specifica qui .

Altri suggerimenti

Non sono sicuro di cosa stai arrivando qui ... il testo citato non dice quale sia la lunghezza di <index>, <begin> o <length>. La prima citazione afferma, piuttosto chiaramente, che un messaggio consiste in una lunghezza di 4 byte, seguita da un identificatore a 1 byte e da un payload arbitrario.

La lunghezza del payload è probabilmente il valore specificato come <index><begin><length> o <=> + 5 a seconda del significato esattamente di <=>. La seconda citazione sembra la definizione di qualunque messaggio identificato dall'identificatore a 1 byte di 0x06. Immagino che:

  1. il payload, i byte che compongono <=>, è probabilmente lungo 14 byte
  2. la lunghezza viene visualizzata in esadecimale, quindi 0x0013 è 19 decimale

In ogni caso, il flusso di byte che stai generando non sembra corrispondere alla definizione del messaggio AND la definizione del messaggio manca di chiarezza.

write () scrive byte. 5 write () produce 5 byte.

Vedi write(int b) .

  

Scrive il byte specificato su questo   flusso di output. Il contratto generale   per scrivere è che è scritto un byte   al flusso di output. Il byte da essere   sono scritti gli otto bit di ordine inferiore di   l'argomento b. I 24 bit di ordine superiore   di b vengono ignorati.

     

Sottoclassi di   OutputStream deve fornire un   implementazione per questo metodo.

     

Parametri:       b - il byte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top