6
votes

Java implémentant htonl

Je communique avec un serveur, chaque message envoyé au serveur doit être rempli avec la longueur du message, xxx pré>

in c exécutant la longueur via htonl Code> et le rembourrage Le message fonctionne, dans l'ordre des octets Java Afaik est déjà dans la commande réseau, donc j'ai supposé que tout ce que je dois faire est d'écrire la longueur de chaîne avant le message dans le flux, mais cela ne fonctionne pas, je manque quelque chose? P>

stream.write(msg.length());
stream.write(msg.getBytes());


1 commentaires

Pouvez-vous ajouter du code de votre implémentation jusqu'à présent? Pour le moment, je n'ai aucune idée de ce qui ne va pas, votre description ne contient pas assez d'informations.


4 Réponses :


0
votes

et int n'a pas de commande d'octet spécifié au moment de l'exécution de la plate-forme Java, simplement parce qu'il n'ya aucun moyen d'observer directement le motif de bits représentant une valeur. Toutefois Méthodes qui convertissent en quelque sorte int (ou d'autres) sur octet [] ont une conversion définie.

Donc, la transmission / réception correcte de cette valeur dépend du codage / décodage correct vers / depuis octet [] . Tant que vous ne nous disez pas comment vous faites cette étape, nous ne pouvons pas vous aider à le faire correctement.


0 commentaires

2
votes

Un problème avec votre implémentation est que la méthode d'écriture n'écrit qu'un octet, voir le Documentation . La phrase importante ici est la suivante: «Les 24 bits de B de B est ignorée. Donc flux.write (msg.length ()); ne fait probablement pas ce qui est destiné. (Je suppose msg.length () renvoie un int, corrigez-moi si je me trompe ici.)

Essayez d'écrire les quatre octets d'un int: xxx

Cela écrit d'abord l'octet le moins important, vous pouvez changer l'ordre si souhaité. Vous pouvez faire la conversion en octets également avec un bit-shifting, la division semble plus compréhensible pour moi, mais c'est une question de goût personnel.


2 commentaires

& 0XFF et >> 8 serait plus approprié ici que% 256` et / 256 , car ils montrent plus précisément l'intention. Mais encore une fois, un dataOutputtream le fait déjà que pour vous: Java.sun.com/javase/6/docs/api/java/io/...


Bon indice avec le da DataOutPutStream. Cela devrait faire les choses qui souhaitaient beaucoup plus de plus lisse.



1
votes

Regardez la méthode Int.ReverseBytes () , qui sur des plates-formes telles que X86 se heurtera au X86 'A HREF = "http://jsimlo.sk/docs/cpu/index.php/bswap.html "rel =" nofollow "> BSWAPL opcode.

Vous pouvez conditionner cela hors du résultat de system.geproperty ("sun.cpu.endian")


0 commentaires

19
votes
int htonl(int value) {
  if (ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN) {
     return value;
  }
  return Integer.reverseBytes(value);
}

1 commentaires

Comment cela n'a-t-il pas plus de upvotes? Réponse la plus rapide!