Я знаю, что некоторые процессоры - Big Endian, а другие - Little Endian. Но есть ли команда, сценарий bash, сценарий python или ряд команд, которые можно использовать в командной строке, чтобы определить, является ли система Big Endian или Little Endian? Что-то вроде:
if <some code> then
echo Big Endian
else
echo Little Endian
fi
Или проще определить, какой процессор использует система, и использовать его для определения своего Endianess?
central-processing-unit
Джейк Уилсон
источник
источник
Ответы:
На большой системе Endian (Solaris на SPARC)
0
В системе с прямым порядком байтов (Linux на x86)
1
Приведенное выше решение является умным и отлично работает для Linux * 86 и Solaris Sparc.
Мне нужно было решение только для оболочки (без Perl), которое также работало на AIX / Power и HPUX / Itanium. К сожалению, последние два не очень хороши: AIX сообщает «6», а HPUX дает пустую строку.
Используя ваше решение, я смог создать что-то, что работало на всех этих системах Unix:
$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6
Что касается решения Python, которое кто-то опубликовал, оно не работает в Jython, потому что JVM рассматривает все как большое. Если кто-нибудь может заставить его работать в Jython, пожалуйста, напишите!
Кроме того, я нашел это, что объясняет порядок различных платформ. Некоторые аппаратные средства могут работать в любом режиме в зависимости от того, что выбирает O / S: http://labs.hoffmanlabs.com/node/544
Если вы собираетесь использовать awk, эту строку можно упростить до:
Для небольших коробок Linux, у которых нет «od» (скажем, OpenWrt), попробуйте «hexdump»:
источник
I
(глаз), а не строчныеl
(ell).printf "\x1" | od -to2 | awk 'NR==1{print$2==1}'
Если вы работаете на довольно новой машине с Linux (больше всего после 2012 года), то
lscpu
теперь содержит эту информацию:Это было добавлено
lscpu
в версии 2.19, которая находится в Fedora> = 17, CentOS> = 6.0, Ubuntu> = 12.04.Обратите внимание , что я нашел этот ответ от этого потрясающего ответа на Unix.SE . Этот ответ содержит много соответствующей информации, этот пост является лишь его кратким изложением.
источник
Вот более элегантный однострочный скрипт на python
код выхода
0
означает большой порядок и1
означает маленький порядокили просто измените
sys.exit
наprint
для вывода на печатьисточник
python -c "import sys;sys.exit(int(sys.byteorder!='big'))"
Основной ответ можно немного упростить, используя
awk
:В системе Big Endian (Солярис, SPARC)
В системе Little Endian (Linux, Intel)
Более новые ядра Linux
Начиная с версии 2.19 пакета util-linux команда
lscpu
начала включать поле, относящееся к Endianness. Так что теперь вы можете просто использовать эту команду, чтобы выяснить это:Это было подтверждено в Ubuntu 12.10 и CentOS 6. Поэтому я хотел бы предположить, что большинство 3.0+ ядер Linux сейчас предлагают это.
В системах Debian / Ubuntu вы также можете использовать эту команду, не зная, когда она стала доступна:
Рекомендации
источник
Этот скрипт Python должен работать для вас:
источник
python -c "from struct import pack;import sys;sys.exit(int(pack('@h',1)==pack('<h',1)))"
. Код выхода равен 0 для старшего и младшего порядкового номера.Это напечатало бы порядок системы.
источник
Вы можете воспользоваться форматом файла ELF, чтобы определить порядок вашей системы. Например, выведите первые шесть байтов произвольного файла ELF в шестнадцатеричном виде:
xxd -c 1 -l 6 /bin/ls
0000000: 7f . 0000001: 45 E 0000002: 4c L 0000003: 46 F 0000004: 02 . 0000005: 01 .
Если последняя строка (шестнадцатеричный байт) равна 01, то в соответствии с форматом ELF 01 - это младший порядок, а 02 - это старший.
Если у вас нет
xxd
на вашем ящике (и у вас есть busybox), попробуйте это:hexdump -s 5 -n 1 -C /bin/busybox
источник
Я нашел способ сделать это в Jython. Поскольку Jython (Python на JVM) работает на виртуальной машине, он всегда сообщает о старшем порядке, независимо от оборудования.
Это решение работает для Linux, Solaris, AIX и HPUX. Не тестировал на Windows:
источник
Однострочная команда на основе формата ELF:
hexdump -s 5 -n 1 /bin/sh
источник
Немного другое требование: мне нужен такой тест в скрипте конфигурации сборки программы, чтобы определить, является ли целевой компьютер компиляции битовым или младшим, без выполнения кода . Скрипт должен быть помещен
#define HAVE_LITTLE_ENDIAN 1
вconfig.h
заголовок или иначе#define HAVE_LITTLE_ENDIAN 0
.Целевая машина компиляции может отличаться от машины сборки, поскольку мы можем выполнять кросс-компиляцию, что также объясняет, почему тест не должен пытаться запустить какой-либо скомпилированный код. Не может быть и речи о том, чтобы иметь небольшую C-программу с
printf
утверждением, которое выплевывает ответ.Возможное решение заключается в следующем. Мы создаем файл с именем,
conftest.c
который содержит это:Теперь мы скомпилируем это с
conftest.o
использованием:Затем мы запускаем:
Если строка
PSILXINUEROCMIWD
встречается, цель имеет младший порядок. Если строкаLISPUNIXCOREDWIM
встречается, она имеет порядок байтов. Если ни одна строка не встречается или, что еще более удивительно, обе встречаются, то тест не пройден.Этот подход работает, потому что константы fourcc, рассчитанные в программе, имеют машинно-независимые значения, обозначающие одинаковые целые числа независимо от порядка следования. Их представление хранения в объектном файле следует за порядком конечной системы, и это видно через представление на основе символов в
strings
.Два нулевых защитных слова гарантируют, что строка изолирована. Это не является строго необходимым, но это гарантирует, что искомая строка не будет встроена в какую-либо другую строку, то есть
strings
она сама выведет ее на строку.PS
USPELL
макрос не заключает в скобки аргументы вставки, потому что он создан для этой конкретной цели, а не для повторного использования.источник