Мы, должно быть, много раз слышали термины 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 скрывает от нас этот внутренний порядок байтов и обеспечивает нам единообразные результаты на всех платформах.
Однако в языках программирования, где код считывает данные непосредственно из областей памяти с помощью указателей, порядок байтов может стать проблемой в случаях, когда данные передаются с одной машины на другую, а обе машины имеют разный порядок байтов.