Есть ли в Linux системная команда, которая сообщает о порядке байтов?

31

Кто-нибудь знает команду, которая сообщает, является ли система Big Endian или Little Endian, или это лучший вариант такой техники, использующей Perl или строку команд?

Perl

# little
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
12345678

# big
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
87654321

од | AWK

# little
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
1

# big
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0

Ссылки

SLM
источник
Что не так с odметодом? Это просто и работает везде. Это то, о чем я подумал, прежде чем прочесть основную часть вашего вопроса
Жиль "ТАК - перестань быть злым"
@ Жиль - ничего особенного, похоже на хак (по крайней мере, для меня). Правда, он может показаться переносимым в других системах, таких как Solaris + AIX, но казалось, что Endianness системы должна быть определена чуть более явно, например, 32-битные или 64-битные, поэтому я был немного удивлен, что это не так. т. Более новый lscpuметод - это больше, чем я ожидал.
SLM
Порядковый номер на практике легче определить, чем размер слова, потому что вам будет трудно найти платформы, которые не являются прямым или прямым порядком байтов (по крайней мере, для целых чисел, с плавающей запятой - другое дело), ​​в то время как существует множество миксов между 32-битным и 64-битным (ЦП, ядро, пользовательская область, данный процесс).
Жиля SO- перестать быть злым »
@ Жиль - да, мой взгляд на мир, вероятно, пренебрежителен, так как я в основном вырос на Solaris или Linux. Не так много за этим.
SLM
odподход должен работать на большинстве открытых систем, не только Linux, которая была бы в случае с помощью lscpu. То, что «лучше», зависит от обстоятельств.
MattBianco

Ответы:

41

lscpu

Команда lscpuпоказывает (среди прочего):

Byte Order:            Little Endian

Системы, на которых, как известно, работают

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (поэтому предполагается также тестирование Debian).

Системы, о которых известно, что они не работают

  • Fedora 14
  • CentOS 5 (принимая RHEL5 из-за этого)

Почему очевидные различия между дистрибутивами?

После долгих раскопок я узнал почему. Похоже, версия util-linux версии 2.19 была первой версией, которая включала функцию, в которой lscpuпоказывались выходные данные, сообщающие о Endianness вашей системы.

В качестве теста я скомпилировал обе версии 2.18 и 2.19 в своей системе Fedora 14, и в приведенных ниже результатах показаны различия:

util-linux 2.18

$ util-linux-ng-2.18/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               1199.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

util-linux 2.19

$ util-linux-2.19/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2667.000
BogoMIPS:              5320.02
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

Вышеуказанные версии были загружены с сайта kernel.org .

Дэвид Баггерман
источник
Спасибо Дэвид, я пропустил это, когда я нашел этот файл. Должен ослепнуть 8-)
slm
Я понимаю, почему я пропустил это. Моя система Fedora 14 lscpuне показывает это значение, однако моя система Ubuntu 12.10 показывает. Если вы не возражаете, я мог бы взять ваш ответ и разделить его на разделы для различных систем и способов сделать это на каждой.
SLM
@slm Конечно, продолжай. Для справки, lscpuработает на Archlinux тоже.
Дэвид Баггерман,
Какая версия Arch?
SLM
Arch не имеет версий; это скользящий релиз ...
Джейсонвриан
7

Использование python:

$ python -c "import sys;print sys.byteorder"
little

или:

printf '\1' | od -dAn
1

где 1для прямого и младшего 00256порядкового номера.

Или используя более короткую perlверсию:

$ perl -V:byteorder
byteorder='12345678';
cuonglm
источник
6

Один из методов, которые я нашел в системах Debian / Ubuntu, - это запустить эту команду:

$ dpkg-architecture
DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_BUILD_MULTIARCH=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_MULTIARCH=x86_64-linux-gnu

Это покажет вам слова маленький или большой в зависимости от архитектуры вашей системы:

$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little
SLM
источник
5

Решение POSIX Shell & C:

cat << EOF > foo.c

#include <endian.h>
#include <stdio.h>

int main() {
  printf("Byte Order: ");
  if (BYTE_ORDER == LITTLE_ENDIAN) 
    printf("little");
  else {
    if (BYTE_ORDER == BIG_ENDIAN)
      printf("big");
    else
      printf("unknown");
  }
  printf(" endian.\n");
  return 0;
}
EOF

gcc -D__USE_POSIX foo.c
./a.out

источник
1

Если вы находитесь в системе, которая не имеет endian.h:

#include <stdio.h>

int main() {
  int test = 0;
  char *bytes = (char *) &test;
  *bytes = 0x1;

  printf("Byte Order: ");
  if (test == 1){
    printf("little");
  }
  else {
      printf("big");
  }
  printf(" endian.\n");
  return 0;
}
Мэтью V Кэри
источник
Что нет любви к VAX Middle-Endian?
thrig
Хорошо замеченный, я был настолько поглощен моими текущими проблемами Intel-> PowerPC, что я не думал о чем-то столь ужасном.
Мэтью V Кэри