アプリケーションは big endian の CPU でも little endian の CPU でもどちらでも、再コンパイルするだけで動作するように作成しておくのが望ましい。 そのためには本セクションで述べるマクロ / 関数を利用するのがよい。
ファイル内の TAD データは 1B に準拠して little endian になっているものとする。 またトレーの内部データ等はCPUのエンディアンに従うものとする。 big endian の CPU ではそのために必要なデータのバイト順を入れ替える操作が必要となる。 ただし、どちらのエンディアンの CPU でも動作するように記述すべきである。
この内容は、btron / cnvend.h を include する事により利用可能である。
|
UH swapH( UH x )
UH x 元のハーフワードデータ
変換後の値
元のハーフワードデータの上位 / 下位バイトの内容をスワップする。
|
UW swapW( UW x )
UW x 元のワードデータ
変換後の値
ワード内のバイトデータのエンディアンを逆転する。
たとえば 0x12345678 は 0x78563412 に変換される。
|
UW swap3B( UW x )
UW x 元のデータ(下位3バイト)
変換後の値
3バイトのデータのバイト順を逆にする。
たとえば 0x123456 では 0x563412 に変換される。
|
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 */で指定された値である。
|
W ConvEndianTC(TC *to, TC *from, W max)
TC *to 変換結果格納先 TC *from 変換元文字列 W max 文字数
変換した文字数
max
文字分の文字列の各文字のエンディアンを変換する。
max
文字に達する前に TNULL に出会ったときには、
それ以降は 0 で埋められる。
|
void ConvEndianHs(UH *to, UH *from, W len)
UH *to 変換結果の格納先 UH *from 変換元 W len ハーフワードの個数
なし
len
個分のハーフワードデータのエンディアンを変換する。
to
と from
に同じメモリ領域
( to
== from
) を指定することが可能。
それ以外で領域に重複がある場合の動作は不定となる。
|
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 進数の数値を指定すると、繰り返し回数となる。
to
と from
に同じメモリ領域
( to
== from
) を指定可能である。
それ以外で領域に重複がある場合の動作は不定となる。
|
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 :
to
と from
に同じメモリ領域
( to == from
) を指定可能である。
それ以外で領域に重複がある場合の動作は不定となる。
toBig
は、通常次のように設定すると良い。
toBig = BIGENDIAN
toBig = bigEndian
|
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 :
to
と from
に同じメモリ領域
(to
== from
) を指定可能である。
それ以外で領域に重複がある場合の動作は不定となる。
toBig
は、通常次のように設定すると良い。
toBig = BIGENDIAN
toBig = bigEndian
|
UW ConvEndianW( UW x )
UW x 元のデータ
CPUエンディアンに変換されたデータ
元のワードデータが CPU のエンディアンと異なるデータ形式のときエンディアンを変換する。 同じ形式のときは元データがそのまま戻される。
|
UH ConvEndianH( UH x )
UH x 元のデータ
CPU エンディアンに変換されたデータ
元のハーフワードデータが CPU のエンディアンと異なるデータ形式のときエンディアンを変換する。
同じ形式のときは元データがそのまま戻される。
|
UW ConvEndian3B( UW x )
UW x 元のデータ
CPUエンディアンに変換されたデータ
元の 3 byteデータが CPU のエンディアンと異なるデータ形式のときエンディアンを変換する。 同じ形式のときは元データがそのまま戻される。
|
UW GetMisalignW(UB d[4])
UB d[4] 任意アドレス
任意アドレスのワードデータ
任意のアドレスから始まる 1 ワード分のデータを読み出す。
たとえば奇数アドレスからワードデータが読めないようなCPUで必要となる。
|
void SetMisalignW(UB d[4], UW x)
UB d[4] 任意アドレス UW x 書き込みデータ
なし
任意のアドレスから始まる 1 ワード分の領域にCPUエンディアンでワードデータを書き込む。 たとえば奇数アドレスにワードデータが書けないようなCPUで必要となる。
|
UW GetMisalign3B( UB d[3] )
UB d[3] 任意アドレス
指定アドレスからの3byteデータ
任意のアドレスから始まる3byte分のデータを読み出す。
|
void SetMisalign3B( UB d[3], UW x )
UB d[3] 任意アドレス UW x 3byteデータ
なし
任意のアドレスから始まる3byte分の領域に3byteデータを書き込む。
|
UH GetMisalignH( UB d[2] )
UB d[2] 任意アドレス
ハーフワードデータ
任意アドレスから始まるハーフワードデータを読み出す。
|
void SetMisalignH( UB d[2], UH x )
UB d[2] 任意アドレス UH x 書き込むハーフワードデータ
なし
任意のアドレスにCPUエンディアンでハーフワードデータを書き込む。