Help us understand the problem. What is going on with this article?

ターミナルで簡便にバイナリを確認する(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

tans
勉強中脳内外部ログ
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした