Frage

Zwei Zitate:

  

Alle übrigen Nachrichten in dem Protokoll die Form von <length prefix><message ID><payload>. Die Länge Präfix ist ein Vier-Byte-Big-Endian-Wert. Die Message-ID ist ein einzelnes Byte dezimal. Die Nutzlast ist Meldung abhängig.

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

Die Anforderungsnachricht wird eine feste Länge und wird verwendet, um einen Block zu beantragen.   Die Nutzlast enthält die folgenden Informationen:

     
      
  • index: integer Angabe der auf Null basierende Stück Index
  •   
  • beginnen: integer die auf Null basierenden Byte innerhalb des Stückes Offset spezifiziert
  •   
  • Länge: integer Angabe der gewünschte Länge.
  •   

Wenn ich alles schreiben bringt es auf 5 Byte. Mit

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

message = byteStream.toByteArray();

EDIT: Leider war ich Art von sauer, als ich es schrieb. es ist das bittorent Protokoll. Mit dieser spec .

War es hilfreich?

Lösung

Die Methode write () schreibt ein Byte.

Wenn Sie es ein Zeichen senden oder int es Streifen nur alles über dem 8. Bit mit & 0xFF.

Sie haben mehr Optionen mit Dataoutputstream (writeInt, writeshort usw.), aber es nutzt Big-Endian-Byte-Reihenfolge, so dass Sie eine Integer.reverseBytes () (oder Short.reverseBytes ()) aufrufen, bevor er in den Wert könnte durchführen müssen, die writeXYZ () -Methode.

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();

Hinweis: Die Spezifikation angeben, nicht die Länge von index, begin und length. Ich wollte nur eine Probe der verfügbaren Optionen geben.

Edit 2: Herausgegeben der Probe basierend auf D.Shawley Antwort und eine spec gefunden hier .

Andere Tipps

Ich bin nicht sicher, was Sie hier bekommen ... der zitierte Text sagt nicht, was die Länge der <index>, <begin> oder <length> ist. Die erste Zitat Staaten, ziemlich deutlich, dass eine Nachricht von einer 4-Byte Länge besteht, gefolgt von einer 1-Byte-Kennung und einer beliebigen Nutzlast.

Die Länge der Nutzlast ist wahrscheinlich entweder der Wert angegeben als <length> oder <length> + 5 je nach genau das, was Mitteln <length>. Das zweite Zitat sieht aus wie die Definition, was Mitteilung durch die 1-Byte-Kennung von 0x06 identifiziert wird. Ich würde vermuten, dass:

  1. die Nutzlast, die Bytes, die <index><begin><length> bilden, ist wahrscheinlich 14 Bytes lang
  2. die Länge in hex wird so 0x0013 angezeigt ist 19 dezimal

In jedem Fall wird der Byte-Strom, die Sie generieren scheint nicht die Nachrichtendefinition entsprechen und die Nachrichtendefinition fehlt Klarheit.

write () schreibt Bytes. 5 write () 's produziert 5 Byte.

Siehe write(int b) .

  

Schreibt die angegebene Byte an diese   Ausgabestrom. Der allgemeine Vertrag   zum Schreiben ist, dass ein Byte geschrieben   in den Ausgabestrom. Das Byte zu sein   geschrieben wird, werden die acht Bits niedriger Ordnung von   das Argument b. Die 24 höherwertigen Bits   von b werden ignoriert.

     

Subklassen von   OutputStream muss ein liefern   Implementierung für diese Methode.

     

Parameter:       b - das Byte

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top