Java Реализовывая htonl

Я связываюсь с сервером, каждое сообщение, отправленное на сервер, должно быть дополнено длиной сообщения,

unsigned int len = htonl(msg.size());

В прокручивании C длины htonl и дополнение работ сообщения, в Java, порядок байтов AFAIK уже находится в сетевом порядке, таким образом, я принял все, которое я должен сделать действительно ли запись, является длиной строки перед сообщением к потоку, но это не работает, я пропускаю что-то?

stream.write(msg.length());
stream.write(msg.getBytes());

Поток OutputStream.

5
задан Joachim Sauer 20 April 2010 в 14:53
поделиться

2 ответа

Проблема с вашей реализацией заключается в том, что метод записи записывает только один байт, см. Документацию . Важное предложение здесь: «24 старших бита b игнорируются». Итак, stream.write (msg.length ()); , вероятно, не выполняет то, что задумано. (Я предполагаю, что msg.length () возвращает int, поправьте меня, если я ошибаюсь.)

Попытайтесь записать четыре байта int:

stream.write(msg.length() % 256);
stream.write((msg.length() / 256) % 256);
stream.write((msg.length() / (256 * 256)) % 256);
stream.write((msg.length() / (256 * 256 * 256)) % 256);

Если первым будет записан младший байт, вы можете изменить закажите, если хотите. Вы можете преобразовывать в байты также с битовым сдвигом, деление мне кажется более понятным, но это вопрос личного вкуса.

1
ответ дан 18 December 2019 в 13:12
поделиться

И int не имеет определенного порядка байтов во время выполнения на платформе Java просто потому, что нет возможности напрямую наблюдать битовый шаблон, представляющий какое-либо значение. Однако методы , которые каким-то образом преобразуют int (или другие) значения в байт [] , имеют определенное преобразование.

Таким образом, правильная передача / прием этого значения зависит от правильного кодирования / декодирования в / из байта [] . Пока вы не говорите нам, как вы это делаете, мы не сможем помочь вам сделать это правильно.

0
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: