Posted at

ターミナルで簡便にバイナリを確認する(Mac)

More than 1 year has passed since last update.


概要

ターミナルで簡便にバイナリを確認するコマンドを調べ、確認した。

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となっている。(a9の次で、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は、01101000が連結されており、

2進数0110->10進数2^2+2^1=6->16進数6であり、

2進数1000->10進数2^3=8->16進数8であるから、

16進数で、68と表される。

(16進数二桁で、1バイトとなる)


文字コード

対応表[2]で、文字コードを確認する。

image.png

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