0

gzip/deflate 形式でエンコードされたデータを解凍する小さなアプリケーションをコーディングしました。

これを達成するために、解凍機能を使用して ZLIB ライブラリを使用しています。

機能が動かないのが難点!つまり、データは圧縮されていません。

ここにコードを投稿します:

int (*decompress)(PBYTE,PULONG,PBYTE,ULONG);

void DecodeData(PBYTE data,ULONG dataSize){
  LoadLibrary("C:\\zlib1.dll");

  decompress=(int(*)(PBYTE,PULONG,PBYTE,ULONG))GetProcAddress(
    GetModuleHandle("zlib1.dll"),"uncompress");

  // Yeah I know the size is hardcoded and it's not right, but it's just a test,
  // so nevermind

  PBYTE decompressedData=(PBYTE)VirtualAlloc(NULL,300,MEM_COMMIT|MEM_RESERVE,
    PAGE_EXECUTE_READWRITE);
  ULONG maxSize=250;

  decompress(decompressedData,&maxSize,data,dataSize);

  MessageBox(0,(char*)decompressedData,0,MB_OK);//MessageBox shows no data, it's blank!
}

関数へのポインターは GetProcAddress によって正常に取得されます。問題は、関数が NULL を返すことです (zlib ドキュメントにリストされているエラーでさえありません)。

4

2 に答える 2

5

関数は gzip データを解凍しません。またuncompress()、「deflate」の意味によっては、それも解凍しない場合があります。

参照している 3 つの形式が考えられます。これは、ストリームを識別し、最後にチェック データを提供するための短いヘッダーとトレーラーを含む実際の圧縮データです。RFC 1951で説明されているように、生の収縮データがあります。RFC 1950で定義された zlib でラップされた deflate データがあります。RFC 1952で定義された gzip でラップされた deflate データがあります。

uncompress()zlib でラップされた deflate データのみを解凍します。gzip でラップされたデータまたは生の deflate データは解凍しません。

あなたがやろうとしていることのコンテキストを提供しませんでした。ただし、「gzip/deflate」と言うときは、その組み合わせから、HTTP コンテンツ エンコーディング オプションの名前を参照していると推測できます。その場合、名前の不運な選択により、「deflate」コンテンツ エンコーディングは、生データではなく、zlib でラップされた deflate データを参照します。 uncompress()適切に配信された HTTP deflate コンテンツ エンコード データを解凍します。

「適切に配達された」と言うのは、そうでないかもしれないからです。ここでもまた、名前の選択が不運であり、Microsoft プログラマーが HTTP 仕様を実際に読み取ることができなかったため、IIS サーバーは、クライアントが deflate コンテンツ エンコーディングを受け入れたときに、zlib でラップされたデータではなく生の deflate データを誤って配信していました。これにより、クライアントは deflate コンテンツ エンコーディングを両方の方法でデコードし、いずれかが機能するかどうかを確認するか、最初から deflate エンコーディングを単に受け入れないというより適切なアプローチを試みる必要があります。クライアントが gzip コンテンツ エンコーディングのみを受け入れる場合、問題はありません。

inflateInit2()zlib の、inflate()、および関数を使用して、inflateEnd()前述の形式 (gzip でラップされた、zlib でラップされた、および raw) をデコードできます。方法については、ドキュメントzlib.hを参照してください。

ちなみに、このuncompress()関数はポインタではなく整数を返します。NULLしたがって、関数が想定されたものではなく返されたと言うとき、そのzlib関数へのインターフェイスが適切に定義されていないとしか思えません。

于 2012-05-27T15:26:55.683 に答える
-3

GetProcAddress で「解凍」を使用するのに、解凍しようとするのはなぜですか? 「解凍」ルーチンのアドレスを取得します!!!

于 2012-05-27T12:57:32.387 に答える