Next: , Previous: , Up: Integer Functions   [Index]


5.14 整数のインポートとエクスポート

mpz_t型の変数は,ここで述べる関数を使って任意長のバイナリデータと相互に変換することができます。

Function: void mpz_import (mpz_t rop, size_t count, int order, size_t size, int endian, size_t nails, const void *op)

opにおけるワードデータの配列をropにインポートして格納します。

パラメータはデータ形式を規定しています。1ワードsizeバイトのcount個分のワードが飲み込まれます。orderが1の場合は最大有効ワードから,-1の場合は最小有効ワードから読み込まれます。ワードはそれぞれendianの値に従い,1の場合は最大有効バイトから,-1の場合は最小有効バイトから,0の場合はホストCPU のエンディアンに従って読み込まれます。各ワードのうち最大有効nailsビット分は読み飛ばされますので,0の場合は全てのワードが読み込まれることになります。

このデータに対しては符号は扱いません。ropは基本的には正数となります。符号についてはアプリケーション側で,例えばmpz_neg関数を使って付与して下さい。

opについてのデータアラインメントは関係ありませんので,どんなアドレスでも利用可能です。

以下, unsigned long型の配列に入っているデータを最大有効要素から,ホストのバイトオーダーで値を読み出して変換する例を示します。

unsigned long  a[20];
/*  zaを初期化 */
mpz_import (z, 20, 1, sizeof(a[0]), 0, 0, a);

この例では,sizeofバイト分のデータを全て利用しており,unsigned long型が利用できる環境であれば実行可能です。例外はCrayベクトルマシンで,short型もint型も(sizeofの返り値に従って)8バイトで格納されますが,そのうち32bitもしくは46bit分しか利用しません。nailsが利用できる時にはこの分をカウントして8*sizeof(int)-INT_BIT bit分だけ渡すようにできます。

Function: void * mpz_export (void *rop, size_t *countp, int order, size_t size, int endian, size_t nails, const mpz_t op)

ropopのワードデータを詰め込みます。

パラメータは書き出されるデータ形式を規定しています。1ワードsizeバイトのcount個分のワードが書き出されます。orderが1の場合は最大有効ワードから,-1の場合は最小有効ワードから書き出されます。ワードはそれぞれendianの値に従い,1の場合は最大有効バイトから,-1の場合は最小有効バイトから,0の場合はホストCPU のエンディアンに従って書き出されます。各ワードのうち最大有効nailsビット分は利用されず,ゼロが詰め込まれます。nailsが0場合は全てのワードが書き出されます。

書き出されるワード数は *countpに格納され,countpNULLの場合はワード数をカウントしません。ropは書き出すデータが入る分確保されていなければなりません。ropNULLの場合は現状のGMPのメモリ割り当て関数(see Custom Allocation)を使って必要なだけ配列が確保されます。どちらのケースでも,返り値はropか,確保されたメモリブロックへのポインタになります。

opが非ゼロの場合は,書き出される最大有効ワードも非ゼロになります。opがゼロであれば,返されるカウントはゼロで,ropには何も書き出されません。更にropNULLであれば,メモリブロックは確保されず,NULLが返されます。

opの符号は無視され,絶対値だけがエクスポートされます。アプリケーションが側でmpz_sgn 関数で符号を確認し,必要であればそれを格納しておいて下さい。(see Integer Comparisons)

ropにおけるデータアラインメントの制限はありませんので,どんなアドレスでも利用可能です。

アプリケーション側で必要なメモリ空間を確保するには,次のように必要サイズを計算します。mpz_sizeinbase関数は常に最小1は返してきますので, このcountも最小1となり, たとえzがゼロで実際にはメモリスペースを必要としない場合でも,malloc(0)となる問題は発生しません。

numb = 8*size - nail;
count = (mpz_sizeinbase (z, 2) + numb-1) / numb;
p = malloc (count * size);