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はこれをリトルエンディアンモードで使用します。したがって、今日利用可能なほとんどのプラットフォームはリトルエンディアンです。
答え2
興味深い質問です。マニュアルページを検索した後、-oが8進数出力(od == 8進数ダンプ)を印刷し、追加したcも関連文字のみを印刷することがわかりました。 -oのみを使用すると、同じ数字が与えられます。
出力を見ると、odは一度に2バイトのデータを読み取ります。最初の2文字を例にしてみましょう。
CHAR - OCTAL - BINARY
1 061 0011 0001
SPACE 040 0010 0000
答えはバイナリ値を連結すると出ます(右は「1」、左は空白)。
0010 0000 0011 0001
このバイナリ値を8進数に変換すると、odが印刷する020061になります。
さて、なぜですか?要点は、odが一度に2バイトを読み、その2バイトが実際には2つの別々の文字であることを気にしないか、知らないということです。