インテル® コンパイラーでは、リトル・エンディアン - ビッグ・エンディアンの変換機能を使用して、ビッグ・エンディアン形式の書式なしシーケンシャル・ファイルの書き込み、およびビッグ・エンディアン形式で作成されたファイルの読み出しが可能です。
IA-32 アーキテクチャーをベースとしたプロセッサーでは、インテル® Fortran は、内部データをリトル・エンディアン形式で処理します。リトル・エンディアン - ビッグ・エンディアンの変換機能は、書式なしシーケンシャル・ファイルにおける Fortran 書式なし入力/出力の演算のためのものです。この機能は次のような処理を可能にします。
ビッグ・エンディアン・データ形式を受け付けるプロセッサー上で開発されたファイルの処理
リトル・エンディアン・システム上における同様のプロセッサー用ビッグ・エンディアン・ファイルの作成
リトル・エンディアン - ビッグ・エンディアンへの変換は、次の操作によって実現されます。
WRITE 操作は、リトル・エンディアン形式をビッグ・エンディアン形式に変換します。
READ 操作は、ビッグ・エンディアン形式をリトル・エンディアン形式に変換します。
この機能は、変数および基本のデータ型の配列 (または配列の添字) の変換を有効にします。派生データ型はサポートされていません。
リトル・エンディアン - ビッグ・エンディアンの変換機能を使用するためには、F_UFMTENDIAN 環境変数を設定して、変換に使用されるユニット数を指定します。その後、このユニット数を使用する READ/WRITE 文が対応する変換を実行します。他の READ/WRITE 文は、通常どおり動作します。
一般的に、変数はセミコロンで分割される 2 つの部分で構成されます。F_UFMTENDIAN 値の中では、スペースは使用できません。この変数の構文は、次のとおりです。
例 |
---|
F_UFMTENDIAN=MODE | [MODE;] EXCEPTION |
次の条件が当てはまります。
条件 |
---|
MODE = big | little EXCEPTION = big:ULIST | little:ULIST | ULIST ULIST = U | ULIST,U U = decimal | decimal -decimal |
また、次の条件が適用されます。
MODE は、現在のデータ形式を定義し、ファイルで表現されます。省略できます。
キーワードの little は、データがリトル・エンディアン形式で、変換されないことを意味します。このキーワードはデフォルトです。
キーワードの big は、データがビッグ・エンディアン形式で、変換されることを意味します。このキーワードは、コロンで省略できます。
EXCEPTION は、MODE の例外リストの定義に使用し、省略できます。EXCEPTION キーワード (little または big) は EXCEPTION リストからのユニットを結合するファイル内のデータ形式を定義します。この値は、リストされたユニットの MODE 値を無効にします。
各リストメンバーの U とは、シンプルユニット番号またはユニット番号です。リストメンバーの上限は、64 です。
decimal は、負でない小数で 232 よりも小さな値です。
変換されたデータは、基本型または基本型の配列です。派生データ型は無効です。
異なるシェルでの変数設定のコマンドは次のとおりです。
シェル |
コマンドライン |
---|---|
Sh |
export F_UFMTENDIAN=MODE;EXCEPTION |
Csh |
setenv F_UFMTENDIAN MODE;EXCEPTION |
セミコロンがある場合は、環境変数値が引用符で囲まれていなければなりません。
また、環境変数には次の構文があります。
例 |
---|
F_UFMTENDIAN=u[,u] . . . |
異なるシェルでの変数設定のコマンドラインは次のとおりです。
シェル |
コマンドライン |
---|---|
Sh |
export F_UFMTENDIAN=u[,u] . . . |
Csh |
setenv F_UFMTENDIAN u[,u] . . . |
リトル・エンディアン - ビッグ・エンディアンの変換中に表示される可能性のあるエラーメッセージを参照してください。これらのエラーは、すべて致命的なエラーです。そのようなエラーが発生した場合には、インテルのテクニカルサポートに問い合わせてください。
次に、上記で説明したコンセプトの使用例を示します。
例 1 |
---|
F_UFMTENDIAN=big |
すべての入力/出力操作で、READ ではビッグ・エンディアンからリトル・エンディアンへの変換、WRITE ではリトル・エンディアンからビッグ・エンディアンへの変換を実行します。
例 2 |
---|
F_UFMTENDIAN="little;big:10,20" または F_UFMTENDIAN=big:10,20 または F_UFMTENDIAN=10,20 |
この場合、ユニット番号が 10 および 20 で、入力/出力演算はビッグ・エンディアン - リトル・エンディアンの変換を実行します。
例 3 |
---|
F_UFMTENDIAN="big;little:8" |
この場合、ユニット番号 8 では変換操作は行われません。その他のすべてのユニットで入力/出力演算はビッグ・エンディアン - リトル・エンディアンの変換を実行します。
例 4 |
---|
4. F_UFMTENDIAN=10-20 |
変換目的で、10、11、12 ... 19、20 ユニットを定義します。これらのユニットでは、入力/出力演算は、ビッグ・エンディアン - リトル・エンディアンの変換を実行します。
F_UFMTENDIAN=10,100 を設定して、次のプログラムを実行したとします。
例 5 |
---|
integer*4 cc4 integer*8 cc8 integer*4 c4 integer*8 c8 c4 = 456 c8 = 789 C prepare a little endian representation of data open(11,file='lit.tmp',form='unformatted') write(11) c8 write(11) c4 close(11) C prepare a big endian representation of data open(10,file='big.tmp',form='unformatted') write(10) c8 write(10) c4 close(10) C read big endian data and operate with them on C little endian machine. open(100,file='big.tmp',form='unformatted') read(100) cc8 read(100) cc4 C Any operation with data, which have been read C . . . close(100) stop end |
lit.tmp ファイルと big.tmp ファイルを比較することで、ファイル内のバイトの順番の違いを確認することができます。
Linux システムでは、od ユーティリティーを使用してファイルを比較できます。
出力例 |
---|
> od -t x4 lit.tmp 0000000 00000008 00000315 00000000 00000008 0000020 00000004 000001c8 00000004 0000034 > od -t x4 big.tmp 0000000 08000000 00000000 15030000 08000000 0000020 04000000 c8010000 04000000 0000034 |
これらのファイルでは、バイトの順番が異なることがわかります。Linux システムに info および od がインストールされている場合、info od をプロンプトで入力してユーティリティーに関する情報を参照することができます。
© 1996-2010 Intel Corporation. 無断での引用、転載を禁じます。