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
,