odで8進数2バイト出力を計算する方法

odで8進数2バイト出力を計算する方法

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

ヒステリックな歴史的理由により、デフォルトでod2バイトの単語が印刷されます。

数字020061(8進数)は、2バイトシーケンス1␣スペース文字)に対応します。なぜ? 16進数を使用すると、より明確になります。 0o20061 = 0x2031、これはASCIIでは0x20(32)、1ASCIIでは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つの別々の文字であることを気にしないか、知らないということです。

関連情報