hexdumpの使い方(第一部)

はじめに

バイナリハック!少しは勉強しよう!
vim -bの使い方を記載した小ネタに書いたvim -bの部分も見て下さい!

hexdumpとは?

ファイルを指定した形でバイナリ表示してくれる。

ではでは勉強スタート

man見たけど、今の僕には理解できません!!!

なので、ひとまず良さげな-Cオプションだけでも手を動かして、動きで覚えよう!!

まずは"a"って文字だけを入力したこんなファイルを作る。
# cat -A /tmp/a
a$
#
このファイルがhexdump -Cでどんな出力がされるかというと
# hexdump -C /tmp/a
00000000 61 0a |a.|
00000002
#

こんな感じ。
意味としては、

第一列はoffsetで16進数の相対位置ってことみたいだから
"00000000"は開始位置
"00000002"は終了位置ってことのよう。位置1が61(=ASCIIのa)で位置2が0a(=ASCIIの制御コードLF)で、最後の位置は2ってこと。

61 0aは上記にも書いたように61=a 0a=LF

右側の|で囲まれた箇所(a.)は、ファイル内容のASCII表示とのこと。
で、この"."はASCIIで文字として表示できないものが"."になるみたい。

ためしに、改行を、CR+LFにしてみたらどんな表示なるのか?
※ファイルにCR(復帰)を差し込むのに、vim -bでやってみました!便利!

# cat -A /tmp/a
a^M$
#
※^MはWindowsで編集されたファイルを開くとよくでてくるやつ!^MはCR(復帰)

# hexdump -C /tmp/a
00000000 61 0d 0a |a..|
00000003
#

こんな感じ。
CRも"."になるのね。

ちなみに日本語のUTF8の"あ"の場合
# cat -A /tmp/a
M-cM-^AM-^B$
# hexdump -C /tmp/a
00000000 e3 81 82 0a |....|
00000004
#

こんなん出ました。
"."は1byte毎に表示されている。hexdumpの出力結果いい感じ。理解できる!!

cat -Aの出力結果は、意味分からん。。。。。
man cat、info catをみると、、、
M-はハイビットみたい。ASCIIは7bitだから、上限は0x7fで、最初の0xe3の部分はそれより上だからハイビット。ふむふむ。

で、"c"って何?で、"^A"とか"^B"は何なんだ!!!!
manにもinfoにも書いてない。。。。。

で、散々なやんで、そうだコンピュータは2進数で判断してるはず!と思い、ためしに2進数変換してみたところ、

カッコ内は2進数

cについて
0xe3(11100011)
0x63(01100011) ※0x63はcのASCIIコード

^Aについて
0x81(10000001)
0x41(01000001) ※0x41はAのASCIIコード
    
^Bについて
0x82(10000010)
0x42(01000010) ※0x42はBのASCIIコード

他のコードも色々試した結果、以下の法則があることが分かった!!

^Aや^B^等、^が付いている場合
先頭2ビットを反転している。

例)^Aの場合
10000001の先頭2bitを反転すると
01000001

c等、^が付いてない場合
先頭1bitのみ反転している。

例)cの場合
11100011の先頭1bitを反転すると
01100011

で、この先頭2bit反転と1bit反転の動きの境界はここ。

^_ →ここまでは先頭2bit反転
0x9f(10011111)
0x5f(01011111)

スペース(先頭に^なし半角スペース) →ここからは先頭1bit反転
0xa0(10100000)
0x20(00100000) ※0x20は半角スペースのASCIIコード

なぜ、ここで動きが変わるのか?深い意味があるのだろうけど、今の自分では理解できません!!!!
いつか理解できる日が来ることを祈る!

おわりに

こんなの知っても無駄だろうし調べなくてもいいか。。。って思ったけど、ぐだぐだ調べてしまった。。。だから仕事の要領が悪いんだろうな。

でも、この検証したのは休日だしいいんだ!!!!
いつか誰かの素朴な疑問を解消するどうでもいいネタになることを祈る!

よくよく思うとhexdumpの勉強ではなくてcat -Aの勉強になってしまった。なので第一部としました。第二部もっとhexdumpの使い方を検証しよう。

  • 最終更新:2014-05-10 22:11:15

このWIKIを編集するにはパスワード入力が必要です

認証パスワード