web-dev-qa-db-ja.com

オプションなしの8進ダンプの解釈

$ echo "hello" | od
0000000 062550 066154 005157
0000006

最初の列がバイトオフセットを表していることを私は知っています。しかし、他の数字がどのように形成されるのかわかりません。 manによると、上記は「8進数バイト」である必要があります。ただし、オプション-bも「8進数バイトを選択」することになっていて、別の何かを出力します。

$echo "hello" | od -b
0000000 150 145 154 154 157 012
0000006

編集:ちなみに、これは私が表示すると予想されるものです。つまり、「hello\n」内のすべての文字のASCII値は、「8進バイト」と呼ばれると予想されるものです。

4
user2820379

odはデフォルトではバイトを表示せず、8進数で単語を表示します。これは完全に直感的ではないかもしれませんが、odvery古いコマンドであることを忘れないでください:-)多少使用しますあなたよりも簡単な例:

$ echo -en '\01\02' | od
0000000 001001
0000002

Intelは リトルエンディアンアーキテクチャ を使用しているため、バイト\01\0200000010 00000001として解釈されます。バイナリ。

8進数はそれぞれ3ビットを表すため、次のようにその数値をグループ化できます。

(0)(000)(001)(000)(000)(001)

したがって、これらの2バイトの8進表現は次のとおりです。

001001

日常の使用では、これはかなり役に立たない。おそらく当時は、メモリダンプを手動でデバッグするのに便利でした:-)

hello\nの例は次のとおりです。

h = 01101000
e = 01100101
l = 01101100
l = 01101100
o = 01101111
\n= 00001010

8進数は3ビットを表しますが、バイトは8ビットであるため、今では少し複雑になっています。したがって、パディングが追加されます:-(結果は象徴的に:

PehPllP\no

エンディアンのために、2バイトの各セットが交換されることを忘れないでください。 [〜#〜] p [〜#〜]は2ビットのパディングです。 8進数の結果は次のとおりです(区切り文字としてスラッシュを使用):

00/01100101/01101000/00/01101100/01101100/00/00001010/01101111

3ビットの8進数グループになりました。

000 110 010 101 101 000 000 110 110 001 101 100 000 000 101 001 101 111

8進数に変換:

062550066154005157

これはあなたの結果と一致します。

結論として、オプションのないodは役に立たないよりも悪いことをおそらくあなたは学んだでしょう:-)

4
wurtel