この章の目次にもどる
前頁:2.13 グローバル変数にもどる
次頁:2.15 色変換にすすむ

2.14 エンディアン変換

アプリケーションは big endian の CPU でも little endian の CPU でもどちらでも、再コンパイルするだけで動作するように作成しておくのが望ましい。 そのためには本セクションで述べるマクロ / 関数を利用するのがよい。

ファイル内の TAD データは 1B に準拠して little endian になっているものとする。 またトレーの内部データ等はCPUのエンディアンに従うものとする。 big endian の CPU ではそのために必要なデータのバイト順を入れ替える操作が必要となる。 ただし、どちらのエンディアンの CPU でも動作するように記述すべきである。

この内容は、btron / cnvend.h を include する事により利用可能である。

swapH
 
ハーフワード内バイトスワップ

【形式】

UH  swapH( UH x )

【パラメータ】

UH  x   元のハーフワードデータ

【リターン値】

変換後の値

【解説】

元のハーフワードデータの上位 / 下位バイトの内容をスワップする。

swapW
 
ワード内のバイト順入れ替え

【形式】

UW  swapW( UW x )

【パラメータ】

UW  x   元のワードデータ

【リターン値】

変換後の値

【解説】

ワード内のバイトデータのエンディアンを逆転する。
たとえば 0x12345678 は 0x78563412 に変換される。

swap3B
 
3バイトデータのエンディアン変換

【形式】

UW  swap3B( UW x )

【パラメータ】

UW  x   元のデータ(下位3バイト)

【リターン値】

変換後の値

【解説】

3バイトのデータのバイト順を逆にする。
たとえば 0x123456 では 0x563412 に変換される。

isConvEndian
 
エンディアン変換の必要性を調べる

【形式】

Bool    isConvEndian(void)

【パラメータ】

なし

【リターン値】

エンディアン変換が必要なとき 1、その他は 0

【解説】

CPU のエンディアン形式と入出力先のエンディアン形式がことなるとき True を戻す。
CPU のエンディアンはヘッダーファイルで定義される

BIGENDIAN           /* Big Endian CPU のとき 1 */
                    /* Little Endian CPU のとき 0 */

入出力先のエンディアンは

IMPORT Bool bigEndian;      /* Big Endian のとき 1 */
                            /* Littile Endian のとき 0 */
で指定された値である。
ConvEndianTC
 
文字列のエンディアン変換

【形式】

W   ConvEndianTC(TC *to, TC *from, W max)

【パラメータ】

TC  *to     変換結果格納先
TC  *from   変換元文字列
W   max     文字数

【リターン値】

変換した文字数

【解説】

max 文字分の文字列の各文字のエンディアンを変換する。 max 文字に達する前に TNULL に出会ったときには、 それ以降は 0 で埋められる。

ConvEndianHs
 
ハーフワード列のエンディアン変換

【形式】

void    ConvEndianHs(UH *to, UH *from, W len)

【パラメータ】

UH  *to 変換結果の格納先
UH  *from   変換元
W   len ハーフワードの個数

【リターン値】

なし

【解説】

len 個分のハーフワードデータのエンディアンを変換する。 tofrom に同じメモリ領域 ( to == from ) を指定することが可能。
それ以外で領域に重複がある場合の動作は不定となる。

ConvEndianStruct
 
構造体のエンディアン変換

【形式】

W   ConvEndianStruct(VP to, VP from, char *form, W max)

【パラメータ】

VP      to      変換結果の格納先
VP      from    変換元
char    *form   形式
W       max     最大バイト数

【リターン値】

変換したバイト数

【解説】

form に指定された構造体の構造に合わせてエンディアンの変換を行う。 最大 max バイトまで変換する。
ただし、フィールドの途中で max を超えるような場合には、max に満たない場合がある。

form は下記の文字で構造体の定義を行う。

    b   B タイプデータ
    h   H タイプデータ
    w   W タイプデータ
    t   3Byte データ
    p   B サイズのパディング

上記の文字の前に 10 進数の数値を指定すると、繰り返し回数となる。

tofrom に同じメモリ領域 ( to == from ) を指定可能である。 それ以外で領域に重複がある場合の動作は不定となる。

ConvEndianTAD
 
TADデータ要素のエンディアン変換

【形式】

WERR    ConvEndianTAD(VP to, VP from, W max, Bool toBig)

【パラメータ】

VP      to      変換結果の格納先
VP      from    変換元
W       max     最大文字数
Bool    toBig   BigEndian に変換するとき True

【リターン値】

≧ 0    変換したデータのサイズ
< 0    エラー(エラーコード)

【解説】

TAD セグメント 1 つまたは 1 文字をエンディアン変換する。 最大 max バイトまで変換する。 ただし、フィールドの途中で max を超えるような場合には、 max に満たない場合がある。
toBig には変換方向を指定する。

toBig = True
ビッグエンディアンへ変換
toBig = False
リトルエンディアンへ変換

変換したデータのサイズをリターン値に返す。
変換できないデータの場合にはエラーを返す。

ER_NOSPT :
未サポートデータ
ER_PAR :
不正データ

tofrom に同じメモリ領域 ( to == from ) を指定可能である。 それ以外で領域に重複がある場合の動作は不定となる。

toBig は、通常次のように設定すると良い。

toBig = BIGENDIAN
ファイル・トレーなどからの入力
つまり、CPU のエンディアン形式への変換
( Little Endian CPU のときは実際には変換は単なるコピーとなる)
toBig = bigEndian
ファイル・トレーなどへの出力
つまり、ファイル・トレーなどのエンディアン形式への変換
ConvEndianTADs
 
TADデータ列のエンディアン変換


【形式】

WERR    ConvEndianTADs(VP to, VP from, W max, Bool toBig)

【パラメータ】

VP      to      変換結果の格納先
VP      from    変換元
W       max     最大バイト数
Bool    toBig   BigEndian に変換するとき True

【リターン値】

≧ 0    変換したデータのサイズ
< 0    エラー(エラーコード)

【解説】

TAD データ列をエンディアン変換する。
最大 max バイトまで変換する。 ただし、フィールドの途中で max を超えるような場合には、 max に満たない場合がある。

toBig には変換方向を指定する。

toBig = True
ビッグエンディアンへ変換
toBig = False
リトルエンディアンへ変換

変換したデータのサイズをリターン値に返す。
変換できないデータの場合にはエラーを返す。

ER_NOSPT :
未サポートデータ
ER_PAR :
不正データ

tofrom に同じメモリ領域 (to == from ) を指定可能である。 それ以外で領域に重複がある場合の動作は不定となる。

toBig は、通常次のように設定すると良い。

toBig = BIGENDIAN
ファイル・トレーなどからの入力
つまり、CPU のエンディアン形式への変換
toBig = bigEndian
ファイル・トレーなどへの出力
つまり、ファイル・トレーなどのエンディアン形式への変換
ConvEndianW
 
ワードデータのCPUエンディアンへの変換

【形式】

UW  ConvEndianW( UW x )

【パラメータ】

UW  x   元のデータ

【リターン値】

CPUエンディアンに変換されたデータ

【解説】

元のワードデータが CPU のエンディアンと異なるデータ形式のときエンディアンを変換する。 同じ形式のときは元データがそのまま戻される。

ConvEndianH
 
ハーフワードデータのCPUエンディアンへの変換

【形式】

UH  ConvEndianH( UH x )

【パラメータ】

UH  x   元のデータ

【リターン値】

CPU エンディアンに変換されたデータ

【解説】

元のハーフワードデータが CPU のエンディアンと異なるデータ形式のときエンディアンを変換する。
同じ形式のときは元データがそのまま戻される。

ConvEndian3B
 
3 byteデータのCPUエンディアンへの変換

【形式】

UW  ConvEndian3B( UW x )

【パラメータ】

UW  x   元のデータ

【リターン値】

CPUエンディアンに変換されたデータ

【解説】

元の 3 byteデータが CPU のエンディアンと異なるデータ形式のときエンディアンを変換する。 同じ形式のときは元データがそのまま戻される。

GetMisalignW
 
任意アドレスのワード読みだし

【形式】

UW  GetMisalignW(UB d[4])

【パラメータ】

UB  d[4]    任意アドレス

【リターン値】

任意アドレスのワードデータ

【解説】

任意のアドレスから始まる 1 ワード分のデータを読み出す。
たとえば奇数アドレスからワードデータが読めないようなCPUで必要となる。

SetMisalignW
 
任意アドレスのワード書き込み

【形式】

void    SetMisalignW(UB d[4], UW x)

【パラメータ】

UB  d[4]    任意アドレス
UW  x   書き込みデータ

【リターン値】

なし

【解説】

任意のアドレスから始まる 1 ワード分の領域にCPUエンディアンでワードデータを書き込む。 たとえば奇数アドレスにワードデータが書けないようなCPUで必要となる。

GetMisalign3B
 
任意アドレスの3byteデータの読みだし

【形式】

UW  GetMisalign3B( UB d[3] )

【パラメータ】

UB  d[3]    任意アドレス

【リターン値】

指定アドレスからの3byteデータ

【解説】

任意のアドレスから始まる3byte分のデータを読み出す。

SetMisalign3B
 
任意アドレスの3byteデータの書き込み

【形式】

void    SetMisalign3B( UB d[3], UW x )

【パラメータ】

UB  d[3]    任意アドレス
UW  x   3byteデータ

【リターン値】

なし

【解説】

任意のアドレスから始まる3byte分の領域に3byteデータを書き込む。

GetMisalignH
 
任意アドレスのハーフワードデータの読みだし

【形式】

UH  GetMisalignH( UB d[2] )

【パラメータ】

UB  d[2]    任意アドレス

【リターン値】

ハーフワードデータ

【解説】

任意アドレスから始まるハーフワードデータを読み出す。

SetMisalignH
 
任意アドレスのハーフワードデータの書き込み

【形式】

void    SetMisalignH( UB d[2], UH x )

【パラメータ】

UB  d[2]    任意アドレス
UH  x   書き込むハーフワードデータ

【リターン値】

なし

【解説】

任意のアドレスにCPUエンディアンでハーフワードデータを書き込む。


この章の目次にもどる
前頁:2.13 グローバル変数にもどる
次頁:2.15 色変換にすすむ