|
gzuncompress
Uncompress a compressed string
(PHP 4 >= 4.0.1, PHP 5)
Example 2734. gzuncompress() example<?php Code Examples / Notes » gzuncompressgabriel
To uncompress in PHP a string that has been compressed using MySQL's COMPRESS() function, you need to discard the first four bytes of the binary data: <?php /* * Example: * * insert into mytable (myfield, ...) values (COMPRESS('foobar'), ...) * * then: */ $compressed = //...select myfield from mytable where... /* * then: */ $uncompressed = gzuncompress(substr($compressed, 4)); ?> Of course, you can use MySQL's UNCOMPRESS() function. I was just providing an alternate method. chappy
Reading an ID3v2.3+ tag it is versy useful, because these tag's frames might be compressed. Zlib compressed frame layout (ID3v2.3): Descriptior Size ------------------- Frameheader: Frame id: 4 bytes Frame size (full frame size - frameheader size): 4 bytes Frame flags: 2 bytes The 2nd byte's 7th bit must be 1 (e.g.: %1xy00000) Frame content decrompessed size: 4 bytes -------------------- Framecontent: Compressed string described in 'frame size' <?php $frame="[read from a mp3 file]"; $frame_id=substr($frame,0,4); /*....*/ $cs=substr($frame,10,4); $checksize=$cs[3]*16777216+$cs[2]*65536+$cs[1]*256+$cs[0]; $content=substr($frame,14,$contentsize); $content=gzuncompress($content); if(strlen($content)!=$checksize){ echo 'Error whil uncrompessing frame data '; } echo $content; ?> emanuele
Note that the manual states that the input parameter must be a string compressed with gzcompress(), so it is not guaranteed that it will compress ANY zlib compressed string. I realized this while decompressing some compressed string in a pdf file. The gzuncompress() function produces a data error, but the string can be successfully decompressed with other zlib decompressors. More info here: http://bugs.php.net/?id=39616 heavyccasey
Note that gzuncompress() may not decompress some compressed strings and return a Data Error. The problem could be that the outside compressed string has a CRC32 checksum at the end of the file instead of Adler-32, like PHP expects. Workaround: <?php function gzuncompress_crc32($data) { $f = tempnam('/tmp', 'gz_fix'); file_put_contents($f, "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $data); return file_get_contents('compress.zlib://' . $f); } ?> |