PHP Conference Japan 2024

gzuncompress

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

gzuncompress解压缩压缩字符串

描述

gzuncompress(字符串 $data, 整数 $max_length = 0): 字符串|false

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

参数

data

gzcompress() 压缩的数据。

max_length

要解码数据的最大长度。

返回值

原始未压缩数据或发生错误时为 false

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

示例

示例 #1 gzuncompress() 示例

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

参见

添加注释

用户贡献的注释 7 条注释

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

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

2) 使用 GZIPOutputStream java 类从 Java Android 应用程序发送到 PHP 的数据,并在 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";

希望这有帮助。如果这为您节省了很多精力和时间,请点赞。
6
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));
}
}
?>
4
gabriel at bumpt dot n-et
17 年前
要使用 PHP 解压缩使用 MySQL 的 COMPRESS() 函数压缩的字符串,您需要丢弃二进制数据的前四个字节

<?php

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

当然,您可以使用 MySQL 的 UNCOMPRESS() 函数。
我只是提供了一种替代方法。
2
squeegee
15 年前
一种无需先读取文件然后对其进行 gzuncompress 解压缩(也许您在这样做时存在内存问题)即可解压缩文件中 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");

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

更多信息请参见此处
http://bugs.php.net/?id=39616
-2
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
'解压缩帧数据时出错<br>';
}
echo
$content;
?>
To Top