#概要
ターミナルで簡便にバイナリを確認するコマンドを調べ、確認した。
xxd
コマンド及び hexdump
コマンドを用いた。
(今回は、od
コマンドには触れなかった)
#環境
os: maxOS Sierra Version 10.12.6
terminal: iTerm2 Build 3.1.5
#内容
$ cat <<EOF >tmp.txt
heredoc> hello
heredoc> 123
heredoc> EOF
$ xxd -bits tmp.txt
00000000: 01101000 01100101 01101100 01101100 01101111 00001010 hello.
00000006: 00110001 00110010 00110011 00001010 123.
$ hexdump tmp.txt
0000000 68 65 6c 6c 6f 0a 31 32 33 0a
000000a
$ xxd tmp.txt
00000000: 6865 6c6c 6f0a 3132 330a hello.123.
$ rm tmp.txt
基本的に出力の一番左のカラム(000006
など)は、ファイル内の位置(バイト数)を表しているはず。
(今回はオプションなしのものを羅列するつもりだったが、01文字列が見たかったので、xxd -bits
を追加した)
#詳細
##対象ファイルの作成
$ cat <<EOF >tmp.txt
heredoc> hello
heredoc> 123
heredoc> EOF
##バイナリを確認するコマンドの実行
$ xxd -bits tmp.txt
00000000: 01101000 01100101 01101100 01101100 01101111 00001010 hello.
00000006: 00110001 00110010 00110011 00001010 123.
$ hexdump tmp.txt
0000000 68 65 6c 6c 6f 0a 31 32 33 0a
000000a
$ xxd tmp.txt
00000000: 6865 6c6c 6f0a 3132 330a hello.123.
##出力の解釈
###左端のカラム
$ xxd -bits tmp.txt
00000000: 01101000 01100101 01101100 01101100 01101111 00001010 hello.
00000006: 00110001 00110010 00110011 00001010 123.
1行目の01101000
から00001010
までのところは、8桁の0/1文字列が6つあり、6バイト分の情報であることが分かる。
そのため、2行目の左端のカラムは、00000006
となっている。
$ hexdump tmp.txt
0000000 68 65 6c 6c 6f 0a 31 32 33 0a
000000a
こちらは16進数表記のものであるが、次の項で示す通り2文字で1バイトを表しているから、
1行目で68
から0a
までの10バイト分の情報を載せており、
2行目の左端のカラムは、000000a
となっている。(a
は9
の次で、10進数の10
)
###2進数/16進数
$ xxd -bits tmp.txt
00000000: 01101000 01100101 01101100 01101100 01101111 00001010 hello.
00000006: 00110001 00110010 00110011 00001010 123.
$ xxd tmp.txt
00000000: 6865 6c6c 6f0a 3132 330a hello.123.
1行目1バイト目だけについて、確認する。
2進数01101000
は、0110
と1000
が連結されており、
2進数0110
->10進数2^2+2^1=6
->16進数6
であり、
2進数1000
->10進数2^3=8
->16進数8
であるから、
16進数で、68
と表される。
(16進数二桁で、1バイトとなる)
###文字コード
対応表[2]で、文字コードを確認する。
6865 6c6c 6f0a 3132 330a
の各バイトにおいて、Hxに対応するChrを見ていけば良い。
68->h
65->e
6c->l
6c->l
6f->o
0a->LF
31->1
32->2
33->3
0a->LF
打ち込んだ通りの文字が保存されていることが確認された。
(LFについては、以下の通り)
ラインフィードの略で、改行を表す制御コード。テキストデータ内での改行位置を明示するために使用する。[3]
###右端のカラム
その行を、asciiコードとして理解した時の内容が出力されているはずである。
##対象ファイルの削除
$ rm tmp.txt
お片付け。
#参考文献
[1]https://www.glamenv-septzen.net/view/1224
[2]http://www.asciitable.com/
[3]https://kotobank.jp/word/LF-1798