"byteorder": Byteorder converting utility in C
hacker emblem 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 も記述しました。


API の説明

  1. エンディアンの異なるバッファのバイトオーダを変換するユーティリティ: 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 構造のメンバは以下の意味を持ちます。

    1. type : フィールドの型

      Byteorder_type_e_char : 1 バイト整数
      Byteorder_type_e_short : 2 バイト整数
      Byteorder_type_e_long : 4 バイト整数

    2. occurrence : フィールドの配列要素数 (配列メンバでない場合は、1 固定で指定します)
    3. net_fld_offset : netp バッファのレコード先頭からのフィールド・オフセット
    4. host_fld_offset : hostp バッファのレコード先頭からのフィールド・オフセット

    hostp にはホスト・バイトオーダ・バッファのアドレスを指定します。
    host_rec_sz には hostp バッファのレコード・サイズを指定します。

    正常終了した場合は変換先バッファのアドレス (dst, netp, hostp のいずれか) を返します。
    なんらかのエラーが発生した場合は、NULL が戻り値に返ります。発生したエラーの詳細は以下のように errno に出力されます。

    1. EINVAL (= 22) : 不正な引数が渡された場合