Bzip2 函数

目录

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

用户贡献笔记 2 notes

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 压缩文件的 stdout 内容,
* 并进行完全错误检测。
* @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