バイナリ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
バイナリーから転送)
ウィキペディアFavicon16進ダンプ。先頭列は行番号、「*」は同じ内容の行の反復を示している。1行あたり16バイトであり、318バイトのデータである。

バイナリバイナリー: binary)とは、算術的な用法では二進法のことであるが、情報技術においては、コンピュータが直接的に処理するために2進数で表現されるデータ(バイナリデータ)のことを指して用いられる。

概要[編集]

バイナリは、コンピュータが直接的に処理することができるようにフォーマットされているため、人間が読んでもただちに意味を理解することはできない。バイナリエディタを用いると、バイナリファイルの内容を16進数で表示させ、編集することができる。

バイナリに対する用語として、プレーンテキストが用いられることがある。テキストは、テキストエディタに読み込ませることにより、人間が文字列として読んで内容を理解できるデータである。ただし厳密に言えば、テキストもバイナリの一種である。文字コード[注釈 1]に基づいてエンコードされたデータをデコードすることにより文字列への変換が可能だが、もとは2進数のデータである。また、バイナリの中に何らかの文字コードに基づいてエンコードされたテキストが混在している場合もある。しかし、データの種類を区別する便宜上、バイナリとテキストは対比して用いられる。C言語におけるファイルストリームのように、処理系によってはテキストモードとバイナリモードで改行文字の扱いが異なる場合もある[1]C++のストリームはデフォルトでテキストモードだが、バイナリモードを指定することもできる[2]

バイナリの例[編集]

たとえば画像ファイルや音声ファイル圧縮されたファイルなどはバイナリが使われることが多い。テキストはバイナリと比べてデータ量が増大しやすく、また誤差をもともと含む浮動小数点数を10進数の文字列として変換すると正確に表現できず、ファイルを読み込む際に完全に復元できないことがあるからである。例えば、PNM画像形式におけるP1/P2/P3のようにASCIIテキストが使われる場合もあるが、バイナリのP4/P5/P6と比べてデータ量が増えてしまう。バイナリであれば8ビット(1オクテット、≒1バイト)で済むデータが、テキストであれば仮に8ビット単位で16進数表記の文字列としてエンコーディングしても16ビット(2オクテット、≒2バイト)必要になってしまう[注釈 2]

バイナリファイルの中にはファイルの先頭にメタ情報(ヘッダ)を持っているものがある。たとえばGIFファイルは複数の画像を持つことができ、ファイルの先頭でそれぞれの画像を区別する情報が記述されている。そのようなメタ情報を持たないファイルはフラットバイナリファイルと呼ばれる。コンピュータプログラム関係では、テキストであるソースコードとの対比からコンパイルされたコードのファイル等[注釈 3]を指してバイナリと呼ばれることがしばしばある。プロプライエタリのソフトウェアはバイナリの形態で提供されるが、特に商用ソフトウェアは他者による解析(リバースエンジニアリング)や改変・改竄・クラッキングを防ぐために、リソースファイルやメディアファイル、ライセンスファイルなどの一部がさらに難読化や暗号化を施した状態で提供されることが多い。

バイナリ形式でのデータの表現方法はさまざまなものがある。例えば、数値であれば0から9までの数をパターン化して記録するBCD、ゾーンビットと実際の数値、正の数か負の数かを記録する符号ビットからなるアンパック10進数(ゾーン10進数)や、実際の数値と符号ビットだけからなるパック10進数などがある。文字列の扱いとしては、ヌル文字(C系言語のリテラル表記では'\0')で終端する方法(ヌル終端文字列、ゼロ終端文字列)や、長さ[注釈 4]を別に保持する、といった方式がある。前者では、'\0' を含むようなバイナリを「文字列」として扱うことができない。固定長のヌル終端文字列や数値などをメンバーに持つ構造体をバイナリとしてそのままシリアライズすることもあるが、処理系やCPUアーキテクチャによってデフォルトのパディングが異なるので、メモリレイアウトを規定するアライメントをソースコード上で明示的に指定する必要がある。

注意点[編集]

バイナリフォーマットでは、エンディアンなどに互換性移植性の上で注意が必要であり、それを避けてテキスト形式で記録することも少なくない(UNIX哲学も参照。なお浮動小数点数ループした構造の表現[要説明]など、テキスト形式にも注意が必要な点は多い)。

脚注[編集]

注釈[編集]

  1. ^ 文字コードはASCIIJIS X 0208Unicodeのような文字集合と、Shift_JISUTF-8UTF-16のような文字符号化方式からなる。
  2. ^ バイナリが使えず、テキストを使うしかない場面では、Base64エンコーディングなどでデータ量を削減する手法も使われている。
  3. ^ オブジェクトファイル実行ファイルなど。またそのような機械語(ネイティブバイナリ)に限らず、WebAssemblyJavaなどのバイトコード類なども含む。
  4. ^ オクテット数、あるいは文字(符号点)の個数。

出典[編集]

関連項目[編集]