2012-03-09 8 views
0

zlibのadler32 functionは、空の文字列が渡されたときに元のシードを返すとは限りません。たとえば、次のようになぜadler32(0xFFFFFFFF、 "")= 0xE000Eですか?

adler32(0xFFFFFFFF,   // seed 
     (const Bytef *) "", // buffer 
     0     // length 
     ) 

戻り0xE000E。私は代わりに0xFFFFFFFFを返すべきだと思います。

他のほとんどの値については、元のシードを返します。しかし、1965855の数値の場合、から  0xFFFFFFFFの場合、入力文字列が空の場合はadler32がシードを変更します。

これは実装のバグか奇妙な振る舞いですか、あるいはAdler-32関数の範囲は実際に[0,0xFFFFFFFF]のサブセットですか?

ポインタがNULLの場合、adler32は常に1(初期シード)を返します。これはdocumentedの動作です。

答えて

1

第1引数は「シード」ではありません。これは、追加される以前のadler32値です。

はい、adler32の範囲はすべての32ビット値ではありません。 0xffffffffは有効なadler32ではありません。有効なadler32値は、32ビット値の上位および下位の16ビットの半分が整数として解釈される場合に、両方とも65521未満である値です。長さがゼロのadler32()を呼び出すと、有効な上半分と無効な下半分とを含む32ビット値の数に無効な番号を加えたものである65521 * 15 + 15 * 65521 + 15 * 15である。上半分と有効な下半分、そして両方の半分が無効な数。

関連する問題