ONC+ 開発ガイド

文字列

C 言語では、文字列が、NULL コードで終わるバイトシーケンスと定義されています。NULL コードは、文字列の長さを求めるときは計算に入れません。ところが、文字列を引き渡したり操作したりするときは、文字へのポインタが使用されます。そのため、XDRライブラリでは文字列を文字シーケンスではなく、char * と定義しています。文字列の外部表現は、内部表現とは大きく異なります。

外部では、文字列は一連の ASCII 文字で表現されます。内部では、文字列は文字ポインタで表現されます。 この 2 つの表現形式の間の変換は、ルーチン xdr_string() で実行します。

bool_t xdr_string(xdrs, sp, maxlength)
   XDR *xdrs;
   char **sp;
   u_int maxlength;

最初の引数 xdrs は、XDR のストリームハンドルです。第 2 引数 sp は文字列へのポインタ (データ型は char **) です。第 3 引数 maxlength は、符号化または復号化の対象とする最大バイト数です。通常、この値はプロトコルで決まります。たとえば、あるプロトコル仕様では、ファイル名は最大 255 文字までとされています。文字数が maxlength の値を超えていれば FALSE、超えていなければ TRUE が返されます。

xdr_string() の機能は、この節でこれまでに説明した他の変換ルーチンと同様です。たとえば、 XDR_ENCODE 処理では、引数 sp は一定の長さの文字列を指します。 この文字列の長さが maxlength を超えていなければ、この文字列がシリアライズされます。

デシリアライズの場合はもう少し複雑です。最初に、ストリームから取り込む文字列の長さを決定します。文字列の長さは maxlength を超えることはできません。次に sp を間接参照します。その値が NULL の場合は、適切なサイズの文字列を割り当てて、*sp がその文字列を指すように設定します。*sp の元々の値が NULL でない場合は、デシリアライズしたデータを入れるターゲットエリアが既に割り当てられており、maxlength 以下の長さの文字列をそこに格納できるものとみなします。どちらの場合も、文字列が復号化されてターゲットエリアに保存されます。次に、文字列の最後に NULL コードが付加されます。

XDR_FREE 処理の場合は、sp を間接参照して文字列を取り出します。その文字列が NULL 文字列でなければ、領域を解放して *spNULL に設定します。この処理を実行するときは、xdr_string() は引数 maxlength を無視します。

空の文字列 ("") を XDR 変換することはできますが、NULL 文字列を XDR 変換はできません。