od
私はコマンドの8進2バイト出力が何であるかを調べようとしています。私は8進出力(-b
フラグ)を理解していますが、8進2バイトは私にとって謎です(-o
)。
-o
誰かがASCIIで結果を計算する方法を説明できますか?
例は次のとおりです。
[root@localhost lpi103-2]# cat text1
1 apple
2 pear
3 banana
[root@localhost lpi103-2]# od -c text1
0000000 1 a p p l e \n 2 p e a r \n 3
0000020 b a n a n a \n
0000030
[root@localhost lpi103-2]# od -bc text1
0000000 061 040 141 160 160 154 145 012 062 040 160 145 141 162 012 063
1 a p p l e \n 2 p e a r \n 3
0000020 040 142 141 156 141 156 141 012
b a n a n a \n
0000030
[root@localhost lpi103-2]# od -oc text1
0000000 020061 070141 066160 005145 020062 062560 071141 031412
1 a p p l e \n 2 p e a r \n 3
0000020 061040 067141 067141 005141
b a n a n a \n
0000030
ベストアンサー1
ヒステリックな歴史的理由により、デフォルトでod
2バイトの単語が印刷されます。
数字020061(8進数)は、2バイトシーケンス1␣
(␣
スペース文字)に対応します。なぜ? 16進数を使用すると、より明確になります。 0o20061 = 0x2031、これは␣
ASCIIでは0x20(32)、1
ASCIIでは0x31(49)です。低いビット(0x31)は最初の文字に対応し、高いビットは2番目の文字に対応します。 odは単語を組み合わせることです。リトルエンディアン方式順序はシステムのバイト順序だからです。 ²
-c
ある出力形式()は文字を印刷し、もう一方の出力形式(-o
)は単語を印刷するため、リトルエンディアンの順序はあまり自然ではありません。各単語は一般的な数値形式で印刷されます。ビッグエンディアン方式記号(左から右への読み取り、最も重要な数字からの読み取り)これは、数値出力でバイト境界がはっきりと表示される16進数でより明らかになります。
echo '1 text' | od -xc
0000000 2031 6574 7478 000a
1 t e x t \n\0
ファイルを一連のバイトとして表示するには、それを使用しますod -t x1
(またはhd
使用可能な場合)。
人が本物の人で、コンピュータが本物のコンピュータで、数字は通常8進数で書かれ、単語の長さは2バイトだった 時代がありました。
²すべての PC(x86、x86-64)はリトルエンディアンです。プラズマ11Unixが始まったところ。 ARM CPUは両方のエンディアンを処理できますが、LinuxとiOSはこれをリトルエンディアンモードで使用します。したがって、今日利用可能なほとんどのプラットフォームはリトルエンディアンです。