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
ために ヒステリック 歴史的な理由から、od
はデフォルトで2バイトの単語¹を出力します。
番号020061(8進数)は、2バイトのシーケンス1␣
に対応します(␣
はスペース文字です)。どうして? 16進数を使用するとより明確になります:0o20061 = 0x2031、および␣
はASCIIで0x20(32)であり、1
は0x31(49)です。次数ビット(0x31)は最初の文字に対応し、上位ビットは2番目の文字に対応します:odは little-の単語を組み立てていますendian 順序。これは、システムのエンディアンであるためです。²
ここでは、出力形式の1つ(-c
)が文字を印刷し、もう1つ(-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)は、Unixが開始された PDP-11 と同様に、リトルエンディアンです。 ARM CPUはどちらのエンディアンにも対応できますが、LinuxとiOSはリトルエンディアンモードで使用します。したがって、最近遭遇する可能性のあるプラットフォームのほとんどはリトルエンディアンです。
興味深い質問です。マニュアルページを閲覧した後、-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
この2進値を8進数に変換すると、020061が得られます。これは、odが出力されるものです。
さて、なぜですか?重要なのは、odは一度に2バイトを読み取ることであり、これらの2バイトが実際には2つの別々の文字であることを懸念または認識していないということです。