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

Абсолютно. Палка tee в конвейере.

31
31.08.2013, 03:18
5 ответов

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 из-за этого)

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

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

Как тест я скомпилировал и версию 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.

41
27.01.2020, 19:37
  • 1
    Спасибо David, я пропустил это, когда я хватал тот файл. Должен идти слепой 8-) –  slm♦ 31.08.2013, 03:28
  • 2
    , который я вижу, почему я пропустил его. Моя система Fedora 14 lscpu не показывает, что значение, однако моя система Ubuntu 12.10 делает. Если Вы не возражаете, я мог бы взять Ваш ответ и разделить его на разделы для различных систем и способов сделать это на каждом. –  slm♦ 31.08.2013, 03:31
  • 3
    @slm Несомненно, разрешение. Для ссылки, lscpu работы над Archlinux также. –  David Baggerman 31.08.2013, 03:33
  • 4
    Какая версия Arch? –  slm♦ 31.08.2013, 03:35
  • 5
    Arch не имеет версий; это - прокручивающийся выпуск... –  jasonwryan 31.08.2013, 03:57

Один метод, который я нашел в системах 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
6
27.01.2020, 19:37

Используя python:

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

или:

printf '\1' | od -dAn
1

где 1 для little endian и 00256 для big endian.

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

$ perl -V:byteorder
byteorder='12345678';
7
27.01.2020, 19:37

Решение 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
5
27.01.2020, 19:37

Если вы работаете в системе, в которой нет 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;
}
1
27.01.2020, 19:37

Теги

Похожие вопросы