リトル・エンディアン - ビッグ・エンディアンの変換 (IA-32 アーキテクチャー)

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

IA-32 アーキテクチャーまたは IA-64 アーキテクチャーをベースとしたプロセッサーでは、インテル® Fortran は、内部データをリトル・エンディアン形式で処理します。リトル・エンディアン - ビッグ・エンディアンの変換機能は、書式なしシーケンシャル・ファイルにおける 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

Note icon

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

その他の環境変数設定

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

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* システムのみ

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 をプロンプトで入力してユーティリティーに関する情報を参照することができます。