Прямой и обратный порядок байтов в Java

Мы, должно быть, много раз слышали термины Little-Endian и Big-Endian в вашем инженерном курсе. Давайте быстро повторим концепцию, стоящую за этими словами.

1. Прямой порядок байтов против обратного порядка байтов

Эти два термина связаны с направлением байтов в слове в архитектуре ЦП.

Память компьютера ссылается на адреса, которые являются положительными целыми числами. «Естественно» хранить числа так, чтобы наименее значимый байт предшествовал наиболее значимому байту в памяти компьютера.

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

«Естественный» порядок, при котором в памяти байт младшего разряда располагается перед байтом старшего разряда, называется прямым порядком байтов.

Многие поставщики, такие как IBM, CRAY и Sun, предпочли обратный порядок, который, конечно же, называется big-endian.

2. Пример заказа

Например, 32-битное шестнадцатеричное значение 0x45679812 будет храниться в памяти следующим образом:

Address 00 01 02 03-----------------------------------Little-endian 12 98 67 45Big-endian 45 67 98 12

3. Порядок байтов в Java

Разница в порядке байтов может стать проблемой при передаче данных между двумя машинами.

Все в двоичных файлах Java хранится в порядке big-endian. Иногда это называется сетевым порядком. Это означает, что если вы используете только Java, все файлы обрабатываются одинаково на всех платформах: Mac, PC, UNIX и т. д. Вы можете свободно обмениваться двоичными данными в электронном виде, не беспокоясь о порядке байтов.

Проблема возникает, когда вам необходимо обмениваться файлами данных с какой-либо программой, написанной не на Java, которая использует прямой порядок байтов, чаще всего это программа, написанная на языке C. Некоторые платформы используют внутренний порядок байтов от старшего к младшему(Mac, IBM 390); некоторые используют прямой порядок байтов(Intel).

4. Как узнать порядок байтов

В Java мы можем использовать метод ByteOrder.nativeOrder() для получения порядка байтов, используемого ЦП. Ниже приведен вывод на ЦП Intel.

ByteOrder byteOrder = ByteOrder.nativeOrder();System.out.println(byteOrder); //LITTLE_ENDIAN

5. Заключение

Java скрывает от нас этот внутренний порядок байтов и обеспечивает нам единообразные результаты на всех платформах.

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

Прокрутить вверх