Question

Deux citations:

  

Tous les messages restants dans le protocole prennent la forme de <length prefix><message ID><payload>. Le préfixe de longueur est une valeur big-endian de quatre octets. L'ID du message est un seul octet décimal. La charge utile dépend du message.

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

Le message de requête est de longueur fixe et permet de demander un blocage.   La charge contient les informations suivantes:

     
      
  • index: entier spécifiant l'indice de pièce de base zéro
  •   
  • begin: entier spécifiant le décalage d'octet de base zéro dans la pièce
  •   
  • longueur: entier spécifiant la longueur demandée.
  •   

Quand j'écris tout cela résume jusqu'à 5 octets. Utiliser

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

message = byteStream.toByteArray();

EDIT: Désolé, j'étais un peu énervé quand je l'ai écrit. c'est le protocole bittorent. Utilisation de cette spec .

Était-ce utile?

La solution

La méthode write () écrit un octet.

Si vous lui envoyez un caractère ou un caractère, il supprime tout ce qui se trouve au-dessus du 8ème bit avec & amp; 0xFF.

DataOutputStream (writeInt, writeShort, etc.) offre plus d'options, mais il utilise l'ordre des octets big endian. Vous devrez peut-être exécuter un appel Integer.reverseBytes () (ou Short.reverseBytes ()) avant de transmettre la valeur à la méthode 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();

Remarque: La spécification n'indique pas la longueur de index, begin et length. Je voulais juste donner un échantillon des options disponibles.

Modifier 2: a modifié l'échantillon en fonction de la réponse de D.Shawley et d'une spécification trouvée ici .

Autres conseils

Je ne sais pas trop à quoi vous voulez en venir ... le texte cité ne dit pas quelle est la longueur de <index>, <begin> ou <length>. La première citation indique assez clairement qu'un message est composé d'une longueur de 4 octets, suivie d'un identifiant de 1 octet et d'une charge utile arbitraire.

La longueur de la charge utile est probablement soit la valeur spécifiée sous la forme <index><begin><length>, soit <=> + 5, en fonction de la signification exacte de <=>. La deuxième citation ressemble à la définition du message identifié par l'identificateur à un octet de 0x06. Je suppose que:

  1. la charge utile, les octets qui constituent <=>, a probablement une longueur de 14 octets
  2. la longueur est affichée en hexa donc 0x0013 est 19 décimal

Dans tous les cas, le flux d'octets que vous générez ne semble pas correspondre à la définition du message ET , la définition du message manque de clarté.

write () écrit des octets. 5 write () produit 5 octets.

Voir write(int b) .

  

Écrit l'octet spécifié dans cette   flux de sortie. Le contrat général   car écrire est-ce qu'un octet est écrit   au flux de sortie. L'octet à être   écrit est les huit bits de poids faible de   l'argument b. Les 24 bits de poids fort   de b sont ignorés.

     

Sous-classes de   OutputStream doit fournir un   implémentation de cette méthode.

     

Paramètres:       b - l'octet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top