Endianness виртуальной машины Java - PullRequest
29 голосов
/ 11 июня 2009

Какую последовательность использует Java на своей виртуальной машине? Я помню, как где-то читал, что это зависит от физической машины, на которой он работает, а затем я читал, что в других местах это всегда, как мне кажется, большой порядок байтов. Что правильно?

Ответы [ 2 ]

31 голосов
/ 11 июня 2009

Многобайтовые данные в class файлах хранятся с прямым порядком байтов.

С Спецификация виртуальной машины Java, Java SE 7 Edition , Глава 4: class Формат файла :

Файл класса состоит из потока 8-битные байты. Все 16-битные, 32-битные и 64-битные величины построены чтение в два, четыре и восемь последовательные 8-битные байты соответственно. Многобайтовые элементы данных всегда хранятся в порядке с прямым порядком байтов, где высокий байты идут первыми.

Кроме того, операнд в инструкции байт-кода также имеет порядок байтов, если он занимает несколько байтов.

С Спецификация виртуальной машины Java, Java SE 7 Edition , Раздел 2.11: Сводка набора инструкций :

Если операнд содержит более одного байта размер, то он хранится в старшем порядке байт старшего порядка первый. За Например, 16-разрядный индекс без знака в локальные переменные хранятся как два байты без знака, byte1 и byte2, такие что его значение равно (byte1 << 8) | byte2.

Так что да, я думаю, можно сказать, что виртуальная машина Java использует big-endian.

18 голосов
/ 11 июня 2009

Фактические рабочие данные, хранящиеся в запущенном процессе, почти наверняка будут соответствовать порядку выполнения процесса. Обычно форматы файлов (включая файлы классов) будут в сетевом порядке (с прямым порядком байтов).

Как правило, трудно сказать, что машина делает под ней, поскольку она абстрагируется от виртуальной машины. Вы не можете разыграть short[] до byte[], как вы можете в C и C ++. java.nio.ByteOrder.nativeOrder () должен дать вам базовый порядок байтов. Соответствие endianess полезно при использовании небайтовых буферов NIO.

...