zlibについて

[戻る]
yuki 2004/01/13(火) 18:56:15
zlibについて、教えて下さい。
現在、以下のようにバッファのデータを圧縮し、再度、解凍するとエラーに
なってしまいます。

<圧縮時>

  z_stream m_z;

  m_z.zalloc = Z_NULL;
  m_z.zfree = Z_NULL;
  m_z.opaque = Z_NULL;
  m_z.next_in = Z_NULL;
  m_z.avail_in = 0;
  
  iStatus = deflateInit(&m_z, Z_DEFAULT_COMPRESSION);

  m_z.next_in = (unsigned char*)pIn; // 入力バッファのポインタ
  m_z.avail_in = iLen;               // 入力バッファ中のデータのバイト数
  m_z.next_out = (unsigned char*)m_Buffer;    // 出力ポインタ
  m_z.avail_out = 1000;          // 出力バッファのサイズ
  
  iStatus = deflate(&m_z, Z_NO_FLUSH);    // 圧縮:通常 第2引数は Z_NO_FLUSH

  pIn = "AAAAABBBBBCCCCCDDDDDEEEEEFFFFF";
  iLen = 30;

  このときは、正常にできました。(iStatusの値は、正常)
  m_Bufferには、圧縮されたデータが入り、バイト数は、24バイトになりました。
  このデータをそのまま、解凍しようとするとエラーになってしまいます。

<解凍時>

  z_stream m_z;

  m_z.zalloc = Z_NULL;
  m_z.zfree = Z_NULL;
  m_z.opaque = Z_NULL;
  m_z.next_in = Z_NULL;
  m_z.avail_in = 0;
 
  iStatus = inflateInit(&m_z);

  m_z.next_in = (unsigned char*)m_Buffer; // 入力バッファのポインタ
  m_z.avail_in = iLen;               // 入力バッファ中のデータのバイト数
  m_z.next_out = (unsigned char*)m_Buffer2;    // 出力ポインタ
  m_z.avail_out = 1000;          // 出力バッファのサイズ

  iStatus = inflate(&m_z, Z_NO_FLUSH);

  このときは、iStatus=-5 (Data Error)
  m_Bufferには、先程の圧縮されたデータ、iLen=24バイトです。
  m_Buffer2の内容は、"AAAAABBBBBCCCCCDBBBC(・・・"となってしまいます。
  msgの内容は、"invalid distance too far back"となります。

  zlibは、1.2.1です。VC++ 6.0 です。
  zlibのソースをそのまま、スタテックリンクして行っています。

どなたか、教えて下さい。
宜しくお願いします。

tetrapod 2004/01/14(水) 10:09:10
なんか zlib の使い方をちゃんと理解していないような気がします。
ここで短い文面で説明するより、配布アーカイブ中の example.c を
読むほうが理解が早いでしょう。

deflate(&z, Z_FINISH); が無い
deflateEnd(&z); が無い

yuki 2004/01/14(水) 10:30:32
ありがとうございます。
もう一度、見直してみます。

yuki 2004/01/15(木) 11:39:37
[[解決]]
できました。ありがとうございます。

古いスレッドには追加発言できません。