C++ сервер Хтонс в Java Java Ntohs клиента преобразования

Я создаю небольшое приложение клиент-сервер TFTP, где сервер разрабатывается с использованием C++, а клиент - с использованием Java.

Здесь я посылаю значение "количество блоков", используя htons преобразование.

Но я не могу преобразовать его обратно в исходное значение на клиенте.

Например, если я посылаю счетчик блоков ntohs(01) (2 байта) от сервера к клиенту. Клиент читает в байтах. Значение, которое я получаю, это байт 0 и байт 1.

Пожалуйста, если кто-то может предоставить решение.

3 ответа

Решение

Я так понимаю, вы имели в виду, что вы используете ntohs декодировать значения, считанные из сети, и htons кодировать значения, передаваемые по сети.

Заглянуть в ByteBuffer#getShort() совместно с ByteBuffer#order(ByteOrder), Порядок байтов в сети имеет порядковый номер, поэтому используйте значение ByteOrder#BIG_ENDIAN настроить свой ByteBuffer должным образом. Обратите внимание, что BIG_ENDIAN это порядок по умолчанию, но в этом случае было бы неплохо явно указать ваши предпочтения.


Вы не упомянули, что вы используете для сетевых коммуникаций в Java. Если это java.net.Socket, ты можешь позвонить Socket#getChannel() чтобы получить java.nio.channels.SocketChannel подтип java.nio.channels.ByteChannel, с которым вы можете использовать ByteBuffer читать и записывать данные.

   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();
    }

Внутренние числа Java всегда располагаются в сетевом байтовом порядке, даже в системах, где нативные целые / двойные числа отсутствуют. Это означает, что вы можете преобразовать любое число, поступающее в Java, с помощью любого из базовых потоков ввода, которые выполняют такое преобразование - которые реализуют java.io.DataInput. ByteBuffer также работает, если вы используете java.nio.Channel, но там вы можете изменить порядковый номер (ByteBuffer.order()), хотя по умолчанию это правильно для сетевого порядка байтов и внутреннего хранилища Java.

Кстати, я думаю, что вы хотите использовать htons но в примере, который вы показываете ntohs, Отправляя из C++, вы хотите преобразовать свой порядок в порядок. При получении от Java (или любого клиента) ваш сервер будет конвертировать обратно, используя ntohs,

Другие вопросы по тегам