エンジニア
バイナリファイルを扱う事になったので、とりあえずググって勉強してみたんだけど、どうもスッキリしない。とりあえず「テキストエディタで開けないものをバイナリファイルって言うんだな」程度は理解出来たのだけど。。
バイナリデータとは10年以上の付き合いとなる、 画像処理 エンジニアのつちもぐらが説明します。
画像処理エンジニアのつちもぐらです。 仕事では色々なフォーマットのバイナリファイルをPythonやC++に読み込ませています。
そもそもバイナリとは何なのか、テキストファイルとは何が違うのかを踏まえながら、プログラム初心者でも理解出来るように、丁寧に分かり易く説明します。
バイナリファイルとは何か
まず、バイナリとは2進数の事です。そしてバイナリファイルとは、バイナリ(2進数)のデータが、必要なだけ延々と続くファイルの事です。データの値やサイズに制約はありません。
多分この定義だけだと、余計に訳が分からなくなったと思うので、ここから深堀します。
以下に示すのは、10進数と16進数、そして2進数を並べた表です。
10進数 | 16進数 | 2進数 |
0 | 00 | 0000_0000 |
1 | 01 | 0000_0001 |
2 | 02 | 0000_0010 |
3 | 03 | 0000_0011 |
4 | 04 | 0000_0100 |
5 | 05 | 0000_0101 |
6 | 06 | 0000_0110 |
7 | 07 | 0000_0111 |
8 | 08 | 0000_1000 |
9 | 09 | 0000_1001 |
10 | 0A | 0000_1010 |
11 | 0B | 0000_1011 |
12 | 0C | 0000_1100 |
13 | 0D | 0000_1101 |
14 | 0E | 0000_1110 |
15 | 0F | 0000_1111 |
16 | 10 | 0001_0000 |
こうやって並べて見てみると、2進数の下位4bit “0000”から”1111″までが、ちょうど16進数の1桁目である”0″から”F” までに対応している事が分かります。そう、 2進数と16進数は相性がバツグンなのです。
そしてコンピュータが扱う処理の最小単位は1バイト(8ビット)である事から、 実際にバイナリファイルを扱う時に “0010111011000101・・” といった2進数の羅列を人間が確認する事は無く、 “4EC5 ・・” といった16進数へ置き直した値を確認する事となります。
バイナリファイルを開いたり編集したりするには、テキストエディタではなくバイナリエディタが必要となります。バイナリエディタはフリーソフトで色々とあるので、ググって気に入った物を使えば良いでしょう。このページでは、ググって最初に出てきたStirlingを使用します。
テキストファイルも実はバイナリファイル
ここで理解を深めるために、テキストファイルについても少し触れておきます。
テキストファイルとは、テキストエディタで文章やプログラムのソース等を入力した後に、その入力した文字列をファイルとして保存したものです。
このファイルとして保存する時に、テキストエディタは文字コード表に従って、エンコード(符号化)して保存します。要は入力した文字列は、文字コード表に従ったバイナリ値に置き換えられて保存される事となります。
テキストエディタで保存したテキストファイルを開く時は、文字コード表に従ってファイルに保存されているデータをデコード(復元)する事で、保存した文字列をディスプレイに表示します。
つまりテキストファイルも、見方を変えればバイナリファイルという事となります。 テキストファイルをバイナリエディタで開けば、デコードする前のバイナリ値を読み取ることが出来ます。
次に示す画像は、”0″ を4つ改行なしでタイプしたファイル “0000.txt” をWindows10のメモ長とバイナリエディタStirlingで開いてみたものです。
ここでテキストエディタでは”0″が4つなのに、バイナリエディタでは”30″が4つ並んでいます。これは、アスキーコード表で文字 “0” が16進の “30” (2進の”0011_0000″) に割り当てられているからです。
鋭い人は、文字化けする理由にもう気が付いたかもしれません。
バイナリファイルは、アスキーコード表のような文字コード表とは関係なく、バイナリファイルの種類(画像ファイルや音声ファイル等)毎に決まったルールで作られたファイルなので、そのようなファイルを文字コード表に従ってテキストエディタが開こうとしても、無茶苦茶な文字が表示されてしまうのは当然です。
バイナリファイルは何故必要なの?
ここまでの説明を読んで「バイナリファイルなんて面倒くさいから使わずに、全部テキストファイルにしちゃえばいいじゃん。」と思った人がいるかもしれません。ただバイナリファイルには、テキストファイルにはない2点のメリットがあります。
ファイルサイズを小さく出来る
数値のみを扱うデータファイルの場合、バイナリファイルの方がファイルサイズを小さく出来ます。バイナリファイルだと、0(00)から255(FF)という数値を1バイトで表現する事が出来ます。()の中の数値は、16進数を示しています。
テキストファイルでは、半角1文字を表現するのに1バイト必要となるので、16進数で記載しても上記の例では単純に2バイト、要は倍のサイズが必要となります。
高速に読み書き出来る
テキストファイルをプログラムで読み書きする時は、 プログラム内部で何かしらの変換作業が必要となりますが、バイナリデータはそのまま扱えるので、ファイルサイズが同じ場合でも若干高速となります。
あとバイナリファイルの方がサイズをコンパクトに出来る事を考慮に入れると、もっと高速になると言っても良いかもしれません。
実際にバイナリファイルを扱う事となったら
職場では既に誰かが作った関数があるので、自分でイチから関数を起こす機会はなかなか無いかもしれません。ただ突然、顧客からローカルフォーマットのバイナリデータを送り付けられて、よりによって自分が担当する事になるというのは良くある話です。
そのような時に狼狽しなくて済むように、また周囲の人がそのような状態となっていたら助けてあげられるように、自分が得意とする言語でバイナリデータくらいは鼻歌交じりで扱えるようになっておきましょう。どの言語でも、ググれば直ぐにやり方は見つかるかと思います。
このブログでも、近日中にPythonでバイナリファイルを扱う記事を書きたいと考えています。
この記事が、少しでも見知らぬ誰かの助けになる事を期待しながら、今日はこの辺で終わります。
最後まで読んで頂き、ありがとうございました。