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.

Était-ce utile?

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 .

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