gzuncompress

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

gzuncompress解压缩已压缩字符串

描述

gzuncompress(string $data, int $max_length = 0): string|false

此函数解压缩一个压缩字符串。

参数

data

gzcompress() 压缩的数据。

max_length

要解码的最大数据长度。

返回值

原始未压缩数据,或错误时返回 false

如果解压缩后的数据超过压缩输入 data 长度的 32768 倍,或超过可选参数 max_length,则该函数将返回错误。

示例

示例 #1 gzuncompress() 示例

<?php
$compressed
= gzcompress('Compress me', 9);
$uncompressed = gzuncompress($compressed);
echo
$uncompressed;
?>

参见

添加注释

用户贡献的注释 7 注释

heavyccasey at gmail dot com
16 年前
请注意,gzuncompress() 可能无法解压缩某些压缩字符串,并返回数据错误。

问题可能是外部压缩字符串在文件末尾具有 CRC32 校验和,而不是 PHP 所期望的 Adler-32。

解决方法
<?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);
}
?>
anonymous at dekho-ji dot com
11 年前
要解码/解压缩收到的 HTTP POST 数据,在 PHP 代码中,请求数据来自通过 HTTP POST GZIP/DEFLATE 压缩格式的 Java/Android 应用程序

1) 从 Java Android 应用程序发送到 PHP 的数据使用 DeflaterOutputStream java 类,并在 PHP 中接收,如下所示
echo gzinflate( substr($HTTP_RAW_POST_DATA,2,-4) ) . PHP_EOL . PHP_EOL;

2) 从 Java Android 应用程序发送到 PHP 的数据使用 GZIPOutputStream java 类,并在 PHP 代码中接收,如下所示
echo gzinflate( substr($HTTP_RAW_POST_DATA,10,-8) ) . PHP_EOL . PHP_EOL;

从 Java Android 端(API 级别 10+)开始,数据以 DEFLATE 压缩格式发送
String body = "Lorem ipsum shizzle ma nizle";
URL url = new URL("http://www.url.com/postthisdata.php");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-encoding", "deflate");
conn.setRequestProperty("Content-type", "application/octet-stream");
DeflaterOutputStream dos = new DeflaterOutputStream(
conn.getOutputStream());
dos.write(body.getBytes());
dos.flush();
dos.close();
BufferedReader in = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String decodedString = "";
while ((decodedString = in.readLine()) != null) {
Log.e("dump",decodedString);
}
in.close();

在 PHP 端(v 5.3.1),解压缩此 DEFLATE 数据的代码将是
echo substr($HTTP_RAW_POST_DATA,2,-4);

从 Java Android 端(API 级别 10+)开始,数据以 GZIP 压缩格式发送

String body1 = "Lorem ipsum shizzle ma nizle";
URL url1 = new URL("http://www.url.com/postthisdata.php");
URLConnection conn1 = url1.openConnection();
conn1.setDoOutput(true);
conn1.setRequestProperty("Content-encoding", "gzip");
conn1.setRequestProperty("Content-type", "application/octet-stream");
GZIPOutputStream dos1 = new GZIPOutputStream(conn1.getOutputStream());
dos1.write(body1.getBytes());
dos1.flush();
dos1.close();
BufferedReader in1 = new BufferedReader(new InputStreamReader(
conn1.getInputStream()));
String decodedString1 = "";
while ((decodedString1 = in1.readLine()) != null) {
Log.e("dump",decodedString1);
}
in1.close();

在 PHP 端(v 5.3.1),解压缩此 GZIP 数据的代码将是
echo substr($HTTP_RAW_POST_DATA,10,-8);

使用所有可用格式打印压缩数据的有用 PHP 代码。

$data = "Lorem ipsum shizzle ma nizle";
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzcompress($data,$i))),2," ") . PHP_EOL . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzdeflate($data,$i))),2," ") . PHP_EOL . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_GZIP))),2," ") . PHP_EOL . PHP_EOL;
echo "\n\n\n";
for($i=-1;$i<=9;$i++)
echo chunk_split(strtoupper(bin2hex(gzencode($data,$i,FORCE_DEFLATE))),2," ") . PHP_EOL . PHP_EOL;
echo "\n\n\n";

希望这有帮助。如果您节省了很多时间和精力,请点赞。
MagicalTux at php dot net
13 年前
嗨,我找到了一个用于那些 gzuncompress() 无法提取的压缩字符串的替代方法。

它比以前的选项好一点,因为它不创建任何临时文件,但它必须将字符串编码为 base64,这意味着它不会像原生等效项(可能是 gzdecode())那样快。

<?php
if (!function_exists('gzdecode')) {
function
gzdecode($string) { // 不支持第二个参数
return file_get_contents('compress.zlib://data:who/cares;base64,'. base64_encode($string));
}
}
?>
gabriel at bumpt dot n-et
16 年前
要使用 PHP 解压缩使用 MySQL 的 COMPRESS() 函数压缩的字符串,您需要丢弃二进制数据的头四个字节

<?php

/*
* 示例:
*
* insert into mytable (myfield, ...) values (COMPRESS('foobar'), ...)
*
* 然后:
*/
$compressed = //...select myfield from mytable where...
/*
* 然后:
*/
$uncompressed = gzuncompress(substr($compressed, 4));
?>

当然,您可以使用 MySQL 的 UNCOMPRESS() 函数。
我只是提供了一种替代方法。
squeegee
14 年前
一种无需先读取文件再进行 gz 解压缩即可解压缩文件中的 zlib 压缩数据的方法(如果您使用这种方法遇到内存问题,可以试试这个方法)是编译来自 zlib 的 zpipe.c 程序(http://www.zlib.net/zpipe.c)...

在 Linux 等系统上

# gcc -lz -o zpipe zpipe.c

# cp zpipe /usr/local/bin

然后执行以下操作

<?php

$uncompressed
= shell_exec("cat $compressed_file | zpipe -d");

?>
emanuele at fondani dot it
17 年前
请注意,手册中说明输入参数必须是使用 gzcompress() 压缩的字符串,因此不能保证它能压缩任何 zlib 压缩的字符串。
我在解压缩 PDF 文件中的一些压缩字符串时发现了这个问题。gzuncompress() 函数会产生数据错误,但该字符串可以用其他 zlib 解压缩器成功解压缩。

更多信息请参见
http://bugs.php.net/?id=39616
chappy at citromail dot hu
18 年前
读取 ID3v2.3+ 标签非常有用,因为这些标签的帧可能被压缩。Zlib 压缩帧布局(ID3v2.3)

描述符大小
-------------------
帧头
帧 ID:4 字节
帧大小(完整帧大小 - 帧头大小):4 字节
帧标志:2 字节
第二个字节的第 7 位必须为 1(例如:%1xy00000)
帧内容解压缩大小:4 字节
--------------------
帧内容
在“帧大小”中描述的压缩字符串

<?php
$frame
="[从 MP3 文件中读取]";
$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<br>';
}
echo
$content;
?>
To Top