c ++ serveur htons à java ntohs conversion client
-
05-07-2019 - |
Question
Je crée un petit client TFTP application serveur où le serveur est développé en utilisant c ++ et client en utilisant java.
Je vous envoie ici "nombre de blocs". valeur
en utilisant la conversion htons
.
Mais je ne suis pas capable de le reconvertir à sa valeur d'origine chez le client.
Par exemple, si j'envoie un nombre de blocs
ntohs (01)
(2 octets) du serveur à
client. Le client lit en octets.
La valeur que je reçois est l'octet 0
et l'octet 1.
S'il vous plaît si quelqu'un peut fournir un solution.
La solution
Je suppose que vous vouliez dire que vous utilisiez ntohs
pour décoder les valeurs lues sur le réseau, et htons
pour encoder les valeurs envoyées sur le réseau.
Recherchez < code> ByteBuffer # getShort () en concert avec ByteBuffer # order (ByteOrder)
. L'ordre d'octet réseau est big endian , utilisez donc la valeur ByteOrder # BIG_ENDIAN
pour configurer votre ByteBuffer
correctement. Notez que BIG_ENDIAN
est la commande par défaut, mais dans ce cas, il serait judicieux d’énoncer explicitement votre préférence.
Vous n'avez pas mentionné ce que vous utilisez pour les communications réseau en Java. S'il s'agit d'un java.net.Socket
, vous pouvez appeler Socket # getChannel ()
pour obtenir un java.nio.channels.SocketChannel
, un sous-type de java.nio.channels.ByteChannel
, avec lequel vous pouvez utiliser ByteBuffer
pour lire et écrire des données.
Autres conseils
private void somemethod(){
byte[] fileDataFull = new byte[516];
byte[] receivedCounter = new byte[2];
readLength = in.read(fileDataFull);
receivedCounter[0] = fileDataFull[2];
receivedCounter[1] = fileDataFull[3];
if (expectedPktCount == convertntohs(receivedCounter)){
}
byte[] b = converthtons((short) expectedPktCount);
}
private short convertntohs(byte[] value) {
ByteBuffer buf = ByteBuffer.wrap(value);
return buf.getShort();
}
private byte[] converthtons(short sValue) {
byte[] baValue = new byte[2];
ByteBuffer buf = ByteBuffer.wrap(baValue);
return buf.putShort(sValue).array();
}
Les numéros de Java en interne sont toujours dans l'ordre des octets du réseau, même sur les systèmes où les entiers / doubles natifs ne le sont pas. Cela signifie que vous pouvez convertir n'importe quel nombre entrant en Java avec l'un des flux d'entrée de base effectuant ce type de conversion, qui implémente java.io.DataInput. ByteBuffer fonctionne également si vous utilisez un java.nio.Channel mais que vous pouvez modifier l’endianisme ( ByteBuffer.order ()
), bien que la valeur par défaut soit correcte pour la commande des octets du réseau et le stockage interne Java.
En passant, je pense que vous voulez utiliser htons
mais dans l'exemple, vous montrez ntohs
. Envoi depuis C ++, vous souhaitez convertir l’ordre h en ordre n . Si vous recevez depuis Java (ou tout autre client), votre serveur sera reconverti avec ntohs
.