Intel HEX

**Intel HEX**はバイナリ情報をASCIIテキスト形式で記載したファイル形式である。マイクロコントローラやEPROMなどのプログラム可能なデバイスのプログラム書き込みのために広く用いられている。典型的な利用用途としてはコンパイラやアセンブラがプログラムのC言語やアセンブリ言語などのソースコードを機械語に変換し、HEXファイルとして出力する。HEXファイルはROMにマシン語のコードを「焼く」ために書き込み機によって読み込まれたり、対象のシステムで読み込んだり実行したりするために転送されたりする。

## 形式
Intel HEXは改行コードによって区切られた複数行のASCIIテキストからなる。各行は複数の2進数値をエンコードする16進数の文字を含む。2進数の値は行の位置や形式、長さによってデータ、メモリアドレスなどに相当する。各行は*レコード*と呼ばれる。

### レコード構造
レコード(テキストの行)は左から順に並んだ6つのフィールド（部分）を有する:
# **スタートコード**、1文字、ASCIIのコロン':'。
# **バイトカウント**、16進数2桁、データフィールドに含まれるバイト(2桁の16進数)の数を示す。最大値は255(0xFF)。16(0x10)や32(0x20)が広く用いられている。
# **アドレス**、16進数4桁、データの16ビットの開始メモリアドレスオフセットを表す。データの物理アドレスはこのオフセットを前もって決められたベースアドレスに加算することで計算される。これにより、16ビットアドレスの64キロバイト制限を超えてメモリアドレスを指定することができる。ベースアドレスはデフォルトが0であるが、様々なタイプのレコードによって変更することができる。ベースアドレスとアドレスオフセットは常にビッグエンディアンで表記される。
# **レコードタイプ** (以下のレコードタイプを参照)、16進数2桁、*00*から*05*でありデータフィールドの意味を表す。.
# **データ**、2*n*桁の16進数で表記された*n*バイトのデータの並び。一部のレコードではこのフィールドは省略される（*n*は0）。データの意味と表現は用途による。
# **[[チェックサム]]**、16進数2桁、レコードにエラーがないことを検証するために計算された値。

#### 色凡例

視覚的な補助として、Intel HEXレコードのフィールドはこの記事において以下のように色分けされる。

#### チェックサム計算
チェックサムの値はレコード内のチェックサムの前のデコードされたバイト値全ての合計の最下位ビット(LSB)の2の補数である。

例えば、のようなレコードの場合、デコードされたバイト値の合計は +  +  +  +  +  +  = `E2`である。`E2`の2の補数はであり、これがレコードの末尾に表れているチェックサムである。

レコードの妥当性はそのレコードのチェックサムを計算し、計算されたチェックサムがレコードに表れているチェックサムと一致するかを確認することで検証される。

### 行末記号
Intel HEXレコードは1行に1つのレコードが表記されるように1つまたは複数の改行コードによって区切られる。このことはレコードを視覚的に区切ることによって可読性を向上し、レコード間のパディングを提供することで機械による構文解析の効率を高めることを可能にしている。

HEXレコードを作成するプログラムは典型的にはそれらの動作するオペレーティングシステムの慣例に従うような改行コードを用いる。例えばLinux上のプログラムはLF（ラインフィード，16進数で`0A`）を単独で行末に用い、Windows上のプログラムはCR（キャリッジリターン，16進数で`0D`）とそれに続くLFを用いる。

### レコードタイプ
Intel HEXは以下の6つの標準的なレコードタイプを持つ。

}
| データ
| データとその16ビットの開始アドレスを含む。バイトカウントはレコード内のデータのバイト数を示す。右に示す例は（10進数で11）バイトのデータ（，，，，，，，，，，）がで始まる連続したアドレスに置かれる。
| 
|- valign="top"
| align="center" | 
| End Of File
| ファイルの最終行に1回必ず表記される。データフィールドは空白（よってバイトカウントは）であり、 アドレスフィールドはが一般的である。
| 
|- valign="top"
| align="center" | 
| 拡張セグメントアドレス
| データフィールドには80x86のリアルモードアドレッシングと互換性のある16ビットのセグメントベースアドレス（よってバイトカウントは）が格納される。アドレスフィールド（通常）は無視される。もっとも最近のレコードから得られたセグメントアドレスには16が掛けられ、それに続くデータレコードのアドレスと足されることでデータの開始物理アドレスが求められる。これにより、1メガバイトまでのアドレス空間のアドレス指定が可能になる。
| 
|- valign="top"
| align="center" | 
| 開始セグメントアドレス
| 80x86プロセッサにおいてはCS:IPレジスタの初期値が示される。アドレスフィールドはでバイトカウントはであり、最初の2バイトはの値、残りの2バイトはIPの値である。
| 
|- valign="top"
| align="center" | 
| 拡張リニアアドレス
| 32ビット(4GiBまで)アドレッシングを可能にする。アドレスフィールド（通常）は無視され、バイトカウントは常にである。2つのエンコードされたビッグエンディアンのデータがそれに続く全てのタイプのレコードの32ビット絶対アドレスの上位16ビットを示す。これらの上位アドレスビットは次のレコードまで有効である。レコードの前にレコードが存在しない場合、アドレスの上位16ビットはデフォルトの0000となる。レコードの絶対アドレスはもっとも最近のレコードによる上位16ビットとレコードの下位16ビットを組み合わせることで求められる。
| 
|-
| align="center" | 
| 開始リニアアドレス
| アドレスフィールドは（未使用）であり、バイトカウントはである。4バイトのデータが80386以降のCPUのEIPレジスタにロードされる32ビットの値を示す。
| 
|}

### 名称のあるフォーマット
特定のレコードタイプのサブセットを用いるHEXファイルのフォーマットを示すために特別な名称が用いられることがある。以下がその例である。
* **I8HEX**はレコードタイプとのみを用いる。（16ビットアドレッシング）
* **I16HEX**はレコードタイプからのみを用いる。（20ビットアドレッシング）
* **I32HEX**はレコードタイプ，，，のみを用いる。（32ビットアドレッシング）

## ファイル例
以下の例は4つのデータレコードとそれに続くEnd Of Fileレコードを含むファイルを示す。
 
 
 
 
 

## 関連項目
;記事
* S-record (SREC) - モトローラによる16進数ファイルフォーマット
* TekHex - テクトロニクスによる16進数ファイルフォーマット
;その他
*  - Intel HEXのレコードをWikipediaの記事上で示す際に有用である

## 参考文献

## 外部リンク
;ドキュメンテーション
* Intel HEXフォーマットの解説
* 例を含むIntel HEXフォーマットのリファレンス

;ソフトウェア
* intelhex2bin - C言語のソースコード付きのIntel HEXからバイナリへのコンバータ
* binex - Intel HEXとバイナリの相互コンバータ
* libgis - Intel HEXなどのフォーマットを変換するオープンソースのライブラリ