Linuxにバイトシーケンスを報告するシステムコマンドはありますか?

Linuxにバイトシーケンスを報告するシステムコマンドはありますか?

システムを報告するコマンドがBig EndianなのかLittle Endianなのか、それとも最良の選択がPerlや一連のコマンド技術を使うのかを知っている人はいますか?

真珠

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

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

OD |

# 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

引用する

答え1

LSCPU

このlscpuコマンドは次のことを示します。

Byte Order:            Little Endian

動作することが知られているシステム

  • オペレーティングシステム6
  • Ubuntu(12.04、12.10、13.04、13.10、14.04)
  • フェドラ(17,18,19)
  • ArchiLinux 2012+
  • Linux Mint Debian(したがって、Debian テストも想定)。

このシステムは動作しないことが知られている。

  • フェドラ14
  • CentOS 5(RHEL5と仮定)

分布の間に明らかな違いがあるのはなぜですか?

多くの検索の最後に理由を見つけました。 util-linuxバージョン2.19lscpuには、システムのバイト順序を報告する出力を表示する機能が含まれている最初のバージョンのようです。

テストでFedora 14システムでバージョン2.18と2.19をコンパイルしましたが、次の出力に違いがあります。

ユーティリティ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

ユーティリティ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ウェブサイト

答え2

使用python:

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

または:

printf '\1' | od -dAn
1

その中には、1リトルエンディアンと00256ビッグエンディアンがあります。

または、より短いperlバージョンを使用してください。

$ perl -V:byteorder
byteorder='12345678';

答え3

Debian / Ubuntuシステムで見つけた1つの方法は、次のコマンドを実行することです。

$ 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

答え4

システムに以下がない場合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;
}

関連情報