Je communique avec un serveur, chaque message envoyé au serveur doit être rempli avec la longueur du message, 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());
4 Réponses :
et Donc, la transmission / réception correcte de cette valeur dépend du codage / décodage correct vers / depuis int code> 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 strong> Méthodes qui convertissent en quelque sorte
int code> (ou d'autres) sur
octet [] code> ont une conversion définie. P>
octet [] code>. Tant que vous ne nous disez pas comment vous faites cette étape, nous ne pouvons pas vous aider à le faire correctement. P>
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 Essayez d'écrire les quatre octets d'un int: p> 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. P> p> flux.write (msg.length ()); code> ne fait probablement pas ce qui est destiné. (Je suppose msg.length () renvoie un int, corrigez-moi si je me trompe ici.)
& 0XFF code> et
>> 8 code> serait plus approprié ici que% 256` et
/ 256 code>, car ils montrent plus précisément l'intention. Mais encore une fois, un
dataOutputtream code> 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.
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. p>
Vous pouvez conditionner cela hors du résultat de system.geproperty ("sun.cpu.endian") em> p>
int htonl(int value) { if (ByteOrder.nativeOrder().equals(ByteOrder.BIG_ENDIAN) { return value; } return Integer.reverseBytes(value); }
Comment cela n'a-t-il pas plus de upvotes? Réponse la plus rapide!
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.