Является ли Java целыми числами в маленьком концевом или большом конце?

Я прошу, потому что я посылаю stream байтов из процесса C в Java. На стороне C 32-битное целое число LSB является первым байтом, а MSB – четвертым байтом.

Поэтому мой вопрос: на стороне Java, когда мы читаем байт, когда он был отправлен из процесса C, что такое endian на стороне Java?

Следующий вопрос: если endian на стороне Java не совпадает с отправленным, как я могу конвертировать между ними?

6 Solutions collect form web for “Является ли Java целыми числами в маленьком концевом или большом конце?”

Используйте сетевой байтовый порядок (большой endian), который так же, как и Java. См. Man htons для разных переводчиков в C.

Я споткнулся здесь через Google и получил ответ, что Java – большой эндинец.

Прочитав ответы, я хотел бы указать, что байты действительно имеют порядковый номер, хотя, к счастью, если вы имеете дело только с микропроцессорами «mainstream», вы вряд ли когда-либо столкнулись с ним, так как Intel, Motorola и Zilog все согласились с направлением сдвига своих чипов UART и что MSB байта будет 2 ** 7, а LSB будет 2 ** 0 в их процессорах (я использовал обозначение мощности FORTRAN, чтобы подчеркнуть, сколько лет этот материал :)).

Я столкнулся с этой проблемой с некоторыми серийными данными нисходящей линии связи Space Shuttle 20+ лет назад, когда мы заменили аппаратное обеспечение $ 10 тыс. На компьютер Mac. Об этом недавно опубликован технический бюллетень NASA Tech. Я просто использовал таблицу поиска элементов с 256 битами (таблицы [0x01] = 0x80 и т. Д.) После того, как каждый байт был смещен из битового streamа.

В Java нет целых без знака. Все целые числа подписаны и имеют большой размер.

На стороне C каждый байт имеет LSB в начале слева и MSB в конце.

Похоже, вы используете LSB как наименее значимый бит, не так ли? LSB обычно обозначает младший байт. Endianness не байт, а байт.

Для преобразования из беззнакового байта в целое число Java:

int i = (int) b & 0xFF; 

Чтобы конвертировать из 32-битного беззнакового числа в байтах [] в Java длительно (от вершины моей головы, не тестировалось):

 long l = (long)b[0] & 0xFF; l += ((long)b[1] & 0xFF) < < 8; l += ((long)b[2] & 0xFF) << 16; l += ((long)b[3] & 0xFF) << 24; 

Нет никакого способа повлиять на что-либо на Java, так как нет прямого (не-API) способа сопоставить некоторые байты непосредственно в int на Java.

Каждый API, который делает это или что-то подобное, определяет поведение довольно точно, поэтому вы должны найти документацию по этому API.

Я бы читал байты один за другим и сочетал их в длинном значении. Таким образом, вы контролируете сущность, а процесс коммуникации прозрачен.

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

  • Как использовать модуль для float / double?
  • Как использовать файлы свойств Java?
  • Как получить пересечение между двумя массивами как новый массив?
  • Какова задача «java» (родительский процесс «launchd»), выполняемый на MacOS X?
  • Использование File.listFiles с FileNameExtensionFilter
  • Как сериализовать объект, который включает BufferedImages
  • отправка списка / карты в качестве параметра POST
  • Базовая аутентификация клиента веб-службы Java
  • Использование JFileChooser с Swing GUI-classами и слушателями
  • Как ответить с ошибкой HTTP 400 в методе Spring MVC @ResponseBody, возвращающем String?
  • Найдите строку в файле и удалите ее
  • Давайте будем гением компьютера.