24
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

#概要
ターミナルで簡便にバイナリを確認するコマンドを調べ、確認した。
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

24
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?