バイナリについて勉強したので忘れないようにメモしておく。
ファイルの種類
パソコンで扱うファイルを分類すると,大きく以下の2つに分かれる。
- テキストファイル
- バイナリファイル
テキストファイルとは
文字を表すデータである。文字コード表に載っているデータだけが書かれているファイルを指す。
バイナリファイルとは
テキストファイル以外の全てのファイルを指す。
文字コードとは
コンピュータは0と1の組み合わせでしか情報を表現できないので,「文字」の情報を扱うためには,「0と1の組み合わせがどんな文字を表すか」というルールを決めておく必要がある。そのルールを文字コードと呼ぶ。
文字コードとは,どんなものかを知る為に,以下に文字コード表の一部を示す。

※こちらのページに載っている文字コード表の一部を引用させていただいた。
例として,アルファベットの「a」の文字コードを調べてみる。表を見ると,「a」は「6」の行の「1」の列にあることが分かる。よって,この文字コード表では,16進数の「61」というデータが「a」を表している。同様に「a」を2進数で表現する場合は「01100001」となる。
※通常,16進数は10進数と間違えないように頭に「0x」と付ける。よって,16進数は「0x61」のように書き表すことができる。
文字コードには様々な種類があり,日本語の文字が使える文字コードだけでも,JIS,Shift-JIS,EUC,UTF-16,UTF-8などがある。このような文字コードを作る元になったものとして,ASCII(アスキー)がある。
ASCIIと日本語文字コードの関係
ASCIIとは,1963年にアメリカ規格協会(ANSI)が定めた,情報交換用の文字コードの体系である。1967年に国際標準化機構(ISO)で定められた情報交換用符号の国際規格「ISO 646」とほぼ同じものである。7ビットで表現され,128種類のローマ字,数字,記号,制御コードで構成されている。実際にはコンピュータは1文字を8ビット(1バイト)で表現するため,256種類の文字を扱うことができるが,ASCIIが定めていない128文字分の拡張領域には,ンピュータメーカーや国によって異なる文字が収録されている。日本では,拡張領域にカナ文字を収録したコード体系が「JIS X 0201」として規格化されている。
この「JIS X 0201」が現存のJIS(日本工業規格)における最も古い文字コードである。JISとは,工業標準化法に基づき,日本工業標準調査会の答申を受けて,主務大臣が制定する工業標準であり,日本の国家標準の一つである。
「JIS X 0201」は,現在では主にShift_JISおよびEUC-JPの一部として用いられており,単独で用いられることはほとんどない。これらの文字コードは JIS X 0208の文字も含んでおり,JIS X 0208にはJIS X 0201にあるほぼすべての文字があるため文字が重複することとなる。この区別のため,JIS X 0201の文字をJIS X 0208の文字の半分の幅で表示することが多い。このため,これらの文字を俗に半角文字,特に片仮名を半角カナと呼ぶ事が多い。
実際にバイナリを読んでみる
今回は,Vimのxxdコマンドを使用してテキストをバイナリに変換する。
テキストからバイナリに変換する
Vimでテキストを開いた状態で,以下のコマンドを実行することで,バイナリへの変換を行うことができる。
:%!xxd
バイナリからテキストに変換する
Vimでバイナリを開いた状態で,以下のコマンドを実行することで,テキストへの変換を行うことができる。
:%!xxd -r
実際にバイナリを読んでみる
以下の内容が記述されたファイルをVimで開き,:%!xxdコマンドを実行する。
aaa bbb ccc
すると,以下のようにテキストがバイナリに変換される。

上記画像の「0000000:」と「aaa..bbb..ccc..」は視認補助の為の情報なので,バイナリは「6161 610d 0a62 6262 0d0a 6363 630d 0a」の部分である。テキストの「a」はバイナリでは「61」,テキストの「b」はバイナリでは「62」,テキストの「c」はバイナリでは「63」という対応付けが行われている。
「0d」と「0a」は改行コードである。今回はWindowsマシンで作業をしたので,改行コードには「CR+LF」が用いられている。
改行コードとは
テキストファイル中で改行を意味する文字コードのことである。正確には,改行してカーソルを行頭に復帰する動作を指示するコードのことを指す。以下の表は改行コードとASCIIコードの対応表である。
| 記号 | 呼び名,別名 | ASCIIコード | マッチング |
|---|---|---|---|
| LF | ラインフィード(Line Feed),ニューライン(New Line) | 0A | \n |
| CR | キャリッジリターン(Carriage Return),リターン(Return) | 0D | \r |
文字コード体系の種類には依存しないが,もともと「CR」(Carriage Return : 行頭復帰)と「LF」(Line Feed : 改行)の2つのコードが存在していたことから,WindowsではCR+LF,Mac OSではCR,UNIXではLFが使われている。 ※Mac OS X以降では,Macの改行コードは「LF」になっている。
頻出する制御コード
バイナリファイルの中に頻繁に登場する制御コードとして以下の表に示すものが挙げられる。
| 16進数 | 文字 | 説明 |
|---|---|---|
| 0x00 | NUL | 何も書かれていないことを表す空文字。C言語などでは文字列の終端に付けて,これ以降に文字列が続かないことを表す。 |
| 0x08 | BS | バックスペース。 |
| 0x09 | HT | 水平タブ。Tabキーで入力される。tab とは table の意味で,もともと表をつくるための文字である。 |
| 0x0A | LF | ラインフィード。元の意味は「次の行に進める」である。改行コードの一つ。 |
| 0x0D | CR | キャリッジリターン。元の意味は「印字ヘッドを行の先頭に戻す」である。改行コードの一つ。 |
上記は最低限,暗記しておきたい。
まとめ
- ファイルには大きく分けて「テキスト」と「バイナリ」の2つがある
- 「バイナリ」に文字コードのルールを適用したものが「テキスト」である
- バイナリを読むには文字コード表を用いる
- Vimではxxdコマンドによって,「テキスト」と「バイナリ」の相互変換ができる
- 改行コードは,Windowsが「CR+LF」,Macが「CR」,Unixが「LF」である
参考
コンピュータの仕組み ~テキストファイルとバイナリファイル~ | リスティング広告の運用代行ならカルテットコミュニケーションズ
ASCIIとJISローマ字―文字コード入門―
ASCIIとは (アスキーとは) [単語記事] – ニコニコ大百科
エスケープシーケンスとは – IT用語辞典 Weblio辞書
ASCIIとは 〔 アスキーコード 〕 【 US-ASCII 】 – 意味/解説/説明/定義 : IT用語辞典
改行コード – Wikipedia
改行コードの話
vimでバイナリを表示し、値を変更したい – rderaログ