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

StackOverflow https://stackoverflow.com/questions/1800983

Вопрос

Я создаю небольшой клиент TFTP  серверное приложение, где разрабатывается сервер  используя c ++ и клиент используя java.

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

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

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

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

Это было полезно?

Решение

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

Просмотрите < code> ByteBuffer # getShort () совместно с ByteBuffer # order (ByteOrder) . Сетевой порядок байтов - big endian , поэтому используйте значение 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 ++ вы хотите преобразовать h ost порядок в n порядок работы. При получении от Java (или любого другого клиента) ваш сервер конвертируется обратно, используя ntohs .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top