Comment est ce 13 octets de long?
-
20-08-2019 - |
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 .
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:
- la charge utile, les octets qui constituent <=>, a probablement une longueur de 14 octets
- 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.