我有很多文本文件,我想压缩它们以节省磁盘空间,然后当我需要它们时,将它们合并并发送给客户端.为了节省CPU周期,我不想解压缩/重新压缩数据.此外,客户端应该能够解压缩数据,结果应该是连接/连接.

以下是我到目前为止所做的工作和结果(用PHP语言编写的代码):

$str1 = "Hello";
$str2 = "World";

$deflate1 = gzdeflate($str1);
$deflate2 = gzdeflate($str2);

$concat = substr($deflate1, 0, -2) . $deflate2;

$inflate = gzinflate($concat);
print($inflate);

结果:

HellnWorld

如您所见,第一个字符串的最后一个字符从o更改为n.

我如何修复这个算法?(算法或c/php/go示例代码都可以).

推荐答案

你试图用gzdeflate()的输出做的事情是行不通的.您不能删除末尾的字节以try 连接.您can只需连接由PHPgzencode()生成的GZIP流(不删除任何内容),然后这些流就是有效的GZIP数据.虽然我被告知gzdecode()有一个错误,不会解码这样的gzip成员序列.(应该有人报告这个漏洞.)

你可以使用deflate_init()deflate_add(),加上适当的冲洗选项,来建立一个兼容的、完整的放气水流.对于每个单独的流,您可以使用ZLIB_SYNC_FLUSH,后跟ZLIB_FINISH来创建一个以空的、存储的Eflate块结束的Eflate流,该块以字节边界结束,然后是一个标记为最后一个块的空固定块.最后一个空的固定块是两个字节.如果从结尾处删除它,则可以在它之后串联另一个放气流.连接的最后一个这样的片段应该not删除最后两个字节,从而整个事物是适当终止的放空流.

在try 时,我发现了另一个错误.如果数据字符串为空,则deflate_add()将不接受ZLIB_SYNC_FLUSH请求.你可以整天重复拨打deflate_add($def, '', ZLIB_SYNC_FLUSH);,但它不会起任何作用.您需要使用ZLIB_SYNC_FLUSH在您的最后一个呼叫的deflate_add(),with的一些数据.例如:

$def = deflate_init(ZLIB_ENCODING_RAW);
$out = deflate_add($def, 'this ', ZLIB_NO_FLUSH);
$out = deflate_add($def, 'is ', ZLIB_NO_FLUSH);
$out .= deflate_add($def, 'a test.', ZLIB_SYNC_FLUSH);
$out .= deflate_add($def, '', ZLIB_FINISH);

(出于某种原因,我每次回答有关PHP的问题时都会发现更多的错误.我想知道为什么人们会用它.)

由OP编辑:以下是我们真正需要的内容:

// first file
$def1 = deflate_init(ZLIB_ENCODING_RAW);
$file1 = deflate_add($def1, "1111111111", ZLIB_SYNC_FLUSH);

// second file, compress in two part
$def2 = deflate_init(ZLIB_ENCODING_RAW);
$file2 = deflate_add($def2, "22222", ZLIB_NO_FLUSH);
$file2 .= deflate_add($def2, "33333", ZLIB_SYNC_FLUSH);

// join on the fly
// $def3 = deflate_init(ZLIB_ENCODING_RAW);
// $joined = $file1 . $file2;
// $joined .= deflate_add($def3, "", ZLIB_FINISH);
// or simply :
$joined = $file1 . $file2 . "\03\00";

// decompress
$decompress = gzinflate($joined);

Php相关问答推荐

调用woocommerce_customer_Save_add动作挂钩时发生致命错误

根据类别在WooCommerce中添加库存数量后缀

未找到laravel cascadeOnEdit

在WooCommerce中处理客户总支出中的退款

Msgraph-sdk-php v2如何从返回对象中获取数据?

在WooCommerce中禁用客户用户角色的纳税计算

将下拉 Select 的值从WooCommerce后端保存并显示到前端

FlySystem v3:使用本地适配器时出现问题

使用ESI的Symfony Sulu清漆

防止同时从Laravel中的用户帐户中提取

隐藏WooCommerce管理子菜单;主页;来自store 经理

使用简码在 WooCommerce 我的帐户中显示一些用户数据

批量更新 WooCommerce 中所有产品的特定自定义字段

WooCommerce 按产品运输插件:仅收取较高的运输费用

PHP 中使用 JSON 的自定义会话处理程序会因错误而 destruct 会话

Golang - Html 模板:如何创建导航项 - 子菜单?我找不到怎么做

在 vue 自定义渲染器中访问变量

PHP / DOM : 解析 HTML 以提取基于类的数​​据

为什么 ECDSA 384 签名验证在 GO 中失败,但在 PHP 中却没有?

mysql / sql修复多对多数据库中的行