リトル・エンディアン - ビッグ・エンディアンの変換

インテル® Fortran コンパイラでは、リトル・エンディアン - ビッグ・エンディアンの変換機能を使用して、ビッグ・エンディアン形式の書式なしシーケンシャル・ファイルの書き込み、およびビッグ・エンディアン形式で作成されたファイルの読み取りが可能です。

インテル Fortran は、IA-32 ベース・プロセッサと Itanium® プロセッサの両方でリトル・エンディアン形式の内部データを処理します。リトル・エンディアン - ビッグ・エンディアンの変換機能は、書式なしシーケンシャル・ファイルにおける Fortran 書式なし入力/出力操作を対象としています。この機能は次のような処理を可能にします:

リトル・エンディアン - ビッグ・エンディアンへの変換は、次の操作によって実現されます:

この機能は、変数および基本のデータ型の配列 (または配列の添字) の変換を有効にします。派生データ型はサポートされていません。

リトル・エンディアン - ビッグ・エンディアンの変換環境変数

リトル・エンディアン - ビッグ・エンディアンの変換機能を使用するためには、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

変換されたデータは、基本のデータ型または基本のデータ型の配列でなければなりません。派生データ型は無効です。

異なるシェルでの変数設定のコマンドライン:

Sh: export F_UFMTENDIAN=MODE;EXCEPTION

Csh: setenv F_UFMTENDIAN MODE;EXCEPTION


セミコロンがある場合は、環境変数値が引用符で囲まれていなければなりません。

その他の環境変数設定

また、環境変数には次の構文があります:

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. F_UFMTENDIAN=10-20

    変換目的で、10、11、12 ...19、20 ユニットを定義します。 これらのユニットでは、入力/出力操作は、ビッグ・エンディアン - リトル・エンディアンの変換を実行します。

  5. F_UFMTENDIAN=10,100 を設定して、次のプログラムを実行したとします。

    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 ファイルを 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

    これらのファイルでは、バイトの順番が異なることがわかります。