qCompress/qUncompress と zlibのinflate/deflate

http://d.hatena.ne.jp/QtCoder/20110819/1313717649 (圧縮・展開する

以前、qCompressとqUncompressについて「zlibと互換みたい便利!」と書いたんですが、実際にzlibで生成したストリームをdecodeすると問題がありました。どうやら、qCompressで作った QByteArray の配列の先頭には、4バイトの圧縮後サイズが入るようです。
http://doc.qt.nokia.com/stable/qbytearray.html#qUncompress

Note: If you want to use this function to uncompress external data compressed using zlib,
you first need to prepend four bytes to the byte array that contain the expected length
(as an unsigned integer) of the uncompressed data encoded in
big-endian order (most significant byte first).

というわけで、zlibで作ったストリームを展開する時は、ByteArrayの先頭に (ビッグエンディアンで) 4バイトのストリームサイズを指定しましょう。

  char* ptr = (char*)&stream_size;
  ba.append( *(ptr + 3) );
  ba.append( *(ptr + 2) );
  ba.append( *(ptr + 1) );
  ba.append( *(ptr + 0) );

同様に、圧縮したデータをzlib互換にするには、先頭の4バイトをカットします。

QByteArray comp = qCompress( srcByteArray );
comp.remove( 0, 4 );