Преобразование сервера c++ htons в клиент ntohs java

Я создаю небольшое клиентское серверное приложение TFTP, в котором сервер разработан с использованием С++, а клиент - с использованием java.

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

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

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

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


person changed    schedule 26.11.2009    source источник


Ответы (2)


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

Посмотрите 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 для чтения и записи данных.

person seh    schedule 26.11.2009

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

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

person Kevin Brock    schedule 27.11.2009