エンディアンについて


##エンディアンとは
エンディアンってのバイナリファイルにおけるバイトオーダーのこと。

例えばあるデータが2バイトで保存されているとする。
`00000001 00000000`
この時、どっちのバイトが0~255の値を示す（すなわち小さい位から1,2,4,8...の位である）。
もう一方は256~65535の値を表す（すなわち小さい位から256,512,1024...の位である）。

ビッグエンディアンだと、はじめのバイトのほうが大きい数字を表す。
上の例では１バイト目が256~32768の位であり、２バイト目が1~128のくらいであるってこと。
これは普段私達が見ている数字と同じ感じ。

リトルエンディアンだと逆にはじめのバイトのほうが小さいくらいを示す。

なお、バイト内では最後の数字が一番小さい位であるというのは変わらない（？）（←よくわからないので分かる人コメントください）

現代では多くのシステムがIntelチップを採用したためにWinもMacもリトルエンディアンになったが、巷にはビッグエンディアンのデータがゴロゴロ転がっている。

リトルエンディアンのつもりでビッグエンディアンのデータを触ると結果がおかしくなり痛い目にあうので注意が必要。
このページではエンディアンを切り替える方法を（僕がよく使う言語に関して）まとめました。


##Fortran
Fortranではコンパイル時にもともとエンディアンを決めちゃう方法と、プログラム中でファイルを読み込む際に切り替える方法がある。
###コンパイル時に決める
これは超簡単。
`gfortran`を使っているなら以下のようにコンパイルすればおｋ。
ただし、プログラム中の全部がビッグエンディアンになるので注意がいる。

```gfortran
gfortran -fconvert=big-endian -o test test.f90
```

###環境変数で装置番号ごとに変える

```bash
export F_UFMTENDIAN="little;big 87"
```
こうすると`基本はリトルエンディアン`、`装置番号87だけビッグエンディアン`ってなる。
もちろん`big`と`small`をひっくり返しても可。
`;`からあとは省略しても可。


##Python
ファイルを読み込むときに決めちゃうのが簡単。
例えば画像を作るのにデータを読み込むとする。まず、配列に開いたファイルのデータを入れる。

```
imagearr=np.fromfile(rfile,'<h',NROWS*NCOLS*1)
```
`imagearr`が画像を作る元のデータを入れておく配列。
`np`はnumpy。
`rfile`はファイルのディレクトリ。
`NROWS*NCOLS*1`は行数×列数を示す。

ここで`<h`ってのがエンディアンと読みこむ変数の種類を示す。
はじめの`<`はリトルエンディアンを示し。
`h`はint16を示す。

以下にその他の例を示す。

<table border="1" class="docutils">
<colgroup>
<col width="10%" />
<col width="53%" />
<col width="14%" />
<col width="23%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">文字</th>
<th class="head">バイトオーダ</th>
<th class="head">サイズ</th>
<th class="head">アラインメント</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">&#64;</span></tt></td>
<td>ネイティブ</td>
<td>native</td>
<td>native</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">=</span></tt></td>
<td>ネイティブ</td>
<td>standard</td>
<td>none</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">&lt;</span></tt></td>
<td>リトルエンディアン</td>
<td>standard</td>
<td>none</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">&gt;</span></tt></td>
<td>ビッグエンディアン</td>
<td>standard</td>
<td>none</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">!</span></tt></td>
<td>ネットワーク (= ビッグエンディアン)</td>
<td>standard</td>
<td>none</td>
</tr>
</tbody>
</table>

<table border="1" class="docutils">
<colgroup>
<col width="17%" />
<col width="31%" />
<col width="21%" />
<col width="17%" />
<col width="14%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">フォーマット</th>
<th class="head">C での型</th>
<th class="head">Python 型</th>
<th class="head">標準のサイズ</th>
<th class="head">備考</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">x</span></tt></td>
<td>pad byte</td>
<td>no value</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">c</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">char</span></tt></td>
<td>長さ 1 の文字列</td>
<td>1</td>
<td>&nbsp;</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">b</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">signed</span> <span class="pre">char</span></tt></td>
<td>整数型 (integer)</td>
<td>1</td>
<td>(3)</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">B</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">unsigned</span> <span class="pre">char</span></tt></td>
<td>整数型</td>
<td>1</td>
<td>(3)</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">?</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">_Bool</span></tt></td>
<td>真偽値型(bool)</td>
<td>1</td>
<td>(1)</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">h</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">short</span></tt></td>
<td>整数型</td>
<td>2</td>
<td>(3)</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">H</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">unsigned</span> <span class="pre">short</span></tt></td>
<td>整数型</td>
<td>2</td>
<td>(3)</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">i</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">int</span></tt></td>
<td>整数型</td>
<td>4</td>
<td>(3)</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">I</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">unsigned</span> <span class="pre">int</span></tt></td>
<td>整数型</td>
<td>4</td>
<td>(3)</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">l</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">long</span></tt></td>
<td>整数型</td>
<td>4</td>
<td>(3)</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">L</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">unsigned</span> <span class="pre">long</span></tt></td>
<td>整数型</td>
<td>4</td>
<td>(3)</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">q</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">long</span> <span class="pre">long</span></tt></td>
<td>整数型</td>
<td>8</td>
<td>(2), (3)</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">Q</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">unsigned</span> <span class="pre">long</span>
<span class="pre">long</span></tt></td>
<td>整数型</td>
<td>8</td>
<td>(2), (3)</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">f</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">float</span></tt></td>
<td>浮動小数点型</td>
<td>4</td>
<td>(4)</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">d</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">double</span></tt></td>
<td>浮動小数点型</td>
<td>8</td>
<td>(4)</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">s</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">char[]</span></tt></td>
<td>文字列</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">p</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">char[]</span></tt></td>
<td>文字列</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">P</span></tt></td>
<td><tt class="xref c c-type docutils literal"><span class="pre">void</span> <span class="pre">*</span></tt></td>
<td>整数型</td>
<td>&nbsp;</td>
<td>(5), (3)</td>
</tr>
</tbody>
</table>

ソース：http://docs.python.jp/2/library/struct.html