C ++ сервер Хтонс в Java Java Ntohs клиента преобразования
-
05-07-2019 - |
Вопрос
Я создаю небольшой клиент 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
.