"byteorder": Byteorder converting utility in C
Happy Hacking! English Here (machine translation)
byteorder: エンディアンの異なるバッファのバイトオーダを変換するユーティリティこの C 言語ユーティリティは、エンディアンの異なるアーキテクチャ間で使用する通信バッファや記録媒体上のレコード・フィールドのバイトオーダを双方向に変換します。 ここでいう、バイトオーダ byteorder とは、俗に言うエンディアン endian の相違のことです。 アドレス値が大きいバイトに数値の下位桁が納められる (0x01020304 という数値が、メモリ上で 0x01, 0x02, 0x03, 0x04 と並ぶ) 場合をビッグ・エンディアンと呼び、上位桁が納められる (メモリ上で 0x04, 0x03, 0x02, 0x01 と並ぶ) 場合をリトル・エンディアンと呼びます。 また、ミドル・エンディアンと呼ばれるものもあり、それらは、メモリ上で 0x02, 0x01, 0x04, 0x03 や 0x03, 0x04, 0x01, 0x02 と並べられます。 このようにバイトオーダが異なるアーキテクチャ間で通信や記録媒体を通じてバイナリ・データをやり取りする際に、データ・フィールドの全てを一律なバイトオーダ (ネットワーク・バイトオーダ (ビッグ・エンディアン)) で揃える処理やバイトオーダの異なるアーキテクチャが混在しているマルチ・プロセッサ環境などで、このユーティリティ API が利用できます。
API を使用するためのヘッダは byteorder.h で、API の実装は byteorder.c です。API の説明は、この文書で後述しています。 テスト・プログラム byteorder_test.c そして make ファイル Makefile も記述しました。
- エンディアンの異なるバッファのバイトオーダを変換するユーティリティ: byteorder()
char *byteorder(Byteorder_dir_e direction , char *netp , size_t net_rec_sz , size_t layouts_n , Byteorder_layout_t *layouts , char *hostp , size_t host_rec_sz )
char *byteorder_longs(Byteorder_dir_e direction , char *netp , char *hostp , size_t occurrence )
char *byteorder_shorts(Byteorder_dir_e direction , char *netp , char *hostp , size_t occurrence )
char *byteorder_chars(Byteorder_dir_e direction , char *netp , char *hostp , size_t occurrence )
byteorder() はバッファのフィールドを一括して変換する場合に使用します。 byteorder_longs() は 32bits 整数あるいはその配列を変換する場合に使用します。 byteorder_shorts() は 16bits 整数あるいはその配列を変換する場合に使用します。 byteorder_chars() は 8bits 整数あるいはその配列を変換する場合に使用します。 direction にはバイトオーダの変換方向を指定します。ネットワーク・バイトオーダ (ビッグ・エンディアン) をホスト・バイトオーダに変換するには Byteorder_dir_e_ntoh を指定し、その逆方向の変換は byteorder_dir_e_hton を指定します。 netp にはネットワーク・バイトオーダ・バッファのアドレスを指定します。 net_rec_sz には netp バッファのレコード・サイズを指定します。 layouts_n にはバッファ上のフィールド数を指定します。 layouts にはバッファ上のフィールド毎の変換レイアウトを指定します。layouts 構造のメンバは以下の意味を持ちます。 - type : フィールドの型
Byteorder_type_e_char : 1 バイト整数 Byteorder_type_e_short : 2 バイト整数 Byteorder_type_e_long : 4 バイト整数
- occurrence : フィールドの配列要素数 (配列メンバでない場合は、1 固定で指定します)
- net_fld_offset : netp バッファのレコード先頭からのフィールド・オフセット
- host_fld_offset : hostp バッファのレコード先頭からのフィールド・オフセット
hostp にはホスト・バイトオーダ・バッファのアドレスを指定します。 host_rec_sz には hostp バッファのレコード・サイズを指定します。 正常終了した場合は変換先バッファのアドレス (dst, netp, hostp のいずれか) を返します。 なんらかのエラーが発生した場合は、NULL が戻り値に返ります。発生したエラーの詳細は以下のように errno に出力されます。 - EINVAL (= 22) : 不正な引数が渡された場合
|