PHP Conference Japan 2024

Bzip2 函数

目录

  • bzclose — 关闭 bzip2 文件
  • bzcompress — 将字符串压缩为 bzip2 编码的数据
  • bzdecompress — 解压缩 bzip2 编码的数据
  • bzerrno — 返回 bzip2 错误号
  • bzerror — 在数组中返回 bzip2 错误号和错误字符串
  • bzerrstr — 返回 bzip2 错误字符串
  • bzflush — 不执行任何操作
  • bzopen — 打开 bzip2 压缩文件
  • bzread — 安全的 bzip2 文件二进制读取
  • bzwrite — 安全的 bzip2 文件二进制写入
添加注释

用户贡献的注释 2 个注释

ec10 at gmx dot net
20 年前
<?php
/**
* @return bool
* @param string $in
* @param string $out
* @desc 使用 bzip2 扩展压缩文件
*/
function bzip2 ($in, $out)
{
if (!
file_exists ($in) || !is_readable ($in))
return
false;
if ((!
file_exists ($out) && !is_writeable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
return
false;

$in_file = fopen ($in, "rb");
$out_file = bzopen ($out, "wb");

while (!
feof ($in_file)) {
$buffer = fgets ($in_file, 4096);
bzwrite ($out_file, $buffer, 4096);
}

fclose ($in_file);
bzclose ($out_file);

return
true;
}

/**
* @return bool
* @param string $in
* @param string $out
* @desc 使用 bzip2 扩展解压缩文件
*/
function bunzip2 ($in, $out)
{
if (!
file_exists ($in) || !is_readable ($in))
return
false;
if ((!
file_exists ($out) && !is_writeable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
return
false;

$in_file = bzopen ($in, "rb");
$out_file = fopen ($out, "wb");

while (
$buffer = bzread ($in_file, 4096)) {
fwrite ($out_file, $buffer, 4096);
}

bzclose ($in_file);
fclose ($out_file);

return
true;
}
?>
salsi at icosaedro dot it
8 年前
<?php
/*
* 读取 BZIP2 文件可能很棘手,我从未见过一个完整的代码示例
* 来处理访问文件时可能发生的任何错误,
* 尤其是在这种情况下解码压缩数据。
* 以下示例是我尝试解决此问题的尝试。
* 一些值得注意的事情是:
* - 必须使用 bzerrno() 检测编码/解码错误。
* - 如果无法创建或读取文件,bzopen() 可能会失败并返回 FALSE,
* 但如果文件编码不正确,它也会成功。
* - 如果 bzread() 无法从源读取,则可能会失败并返回 FALSE,但
* 它在文件结尾和编码错误时返回空字符串。
* - bzread() 仍然可能返回损坏的数据,而没有任何错误,直到
* BZIP2 算法遇到第一个哈希代码,因此在到达文件末尾之前,
* 检索到的数据是不可靠的。
*/

// 首先确保安全:
error_reporting(-1);
// 出错时,设置 $php_errormsg:
ini_set("track_errors", "1");

/**
* 读取并显示 BZIP2 压缩文件的标准输出内容,
* 并进行完整的错误检测。
* @param string $fn 文件名。
* @return void
*/
function displaysBZIP2File($fn)
{
echo
"读取 $fn:\n";
$bz = @bzopen($fn, "r");
if(
$bz === FALSE ){
echo
"错误:bzopen() 失败:$php_errormsg\n";
return;
}
$errno = bzerrno($bz);
if(
$errno != 0 ){
// 可能检测到“DATA_ERROR_MAGIC”(不是 BZIP2 文件)或“DATA_ERROR”(
// BZIP2 解码错误)以及其他 BZIP2 错误。
echo "错误:bzopen(): BZIP2 解码失败:", bzerrstr($bz), "\n";
@
bzclose($bz);
return;
}
while(!
feof($bz) ) {
$s = bzread($bz, 100);
if(
$s === FALSE ){
echo
"错误:bzread() 失败:$php_errormsg\n";
@
bzclose($bz);
return;
}
$errno = bzerrno($bz);
if(
$errno != 0 ){
// 可能检测到“DATA_ERROR”(BZIP2 解码错误)以及其他
// BZIP2 错误。
echo "错误:bzread(): BZIP2 解码失败:", bzerrstr($bz), "\n";
@
bzclose($bz);
return;
}
echo
"读取:", var_export($s, true), "\n";
}
if( !
bzclose($bz) ){
echo
"错误:bzclose() 失败:$php_errormsg\n";
}
}

// 目标文件:
$fn = "test.bz2";

// 测试 1:写入并读取一个正常的 BZIP2 文件:
file_put_contents($fn, bzcompress("文件内容。"));
displaysBZIP2File($fn); // 工作正常。

// 测试 2:无效内容,不是 BZIP2 文件:
file_put_contents($fn, "这是一个纯文本文件,根本没有压缩!");
displaysBZIP2File($fn); // 错误:bzread(): BZIP2 解码失败:DATA_ERROR_MAGIC

// 测试 3:创建一个损坏的 BZIP2 文件:
$plain = str_repeat("相当随机的字符串。 ", 1000);
$compressed = bzcompress($plain);
$compressed_corrupted = $compressed;
$compressed_corrupted[(int)(strlen($compressed)/2)] = 'X'; // 在中间放入随机字符
file_put_contents($fn, $compressed_corrupted);
displaysBZIP2File($fn);
// 只在一些 KB 的垃圾数据之后,它才提示:
// 错误:bzread(): BZIP2 解码失败:DATA_ERROR

// 永久告别令人头疼的代码安全问题。
?>
To Top