c++ - 解压附加的压缩字符串
问题描述
我正在创建一个应用程序,我必须在其中存储大量字符串数据 - 以块的形式接收。我正在尝试以压缩格式保存它。但是,如果我使用 zlib 压缩字符串并类似地向其附加更多压缩块,则解压缩失败。
std::string allinput = "AAAA";
std::string cstr1 = compress_string( allinput );
std::string allinput2 = "BBBB";
std::string cstr2 = compress_string( allinput2 );
std::string cstr = cstr1 + cstr2;
std::string out = decompress_string( cstr );
std::cout << "DECOMP:" << out << "\n" ;
使用上面的代码,我得到以下输出:
AAAA
是否有一些方法可以解压缩附加的压缩字符串块
PS: 的实现compress_string
和decompress_string
可以从C++ 代码片段 - Compressing STL Strings with zlib中找到
解决方案
您添加压缩块的想法效果不佳,您必须将该接口https://panthema.net/2007/0328-ZLibString.html替换为 zlib。
如果您查看 zlib 内部,您会看到压缩例程deflate
将在用完要压缩的数据时停止,基于avail_in
. 将其设置为您拥有的数据量,并在获得新字符串时增加。
(如果你想在每一步都有可用的结果,它会变得更加复杂。)
单独压缩多个字符串并将它们添加在一起是可能的,但这是一个坏主意。它会增加开销,并给出更糟糕的结果,因为压缩是基于输入数据中的模式,并且通过多次压缩,您必须重新发现每个输入中的模式。
推荐阅读
- security - HP Fortify 是否引用 NIST NVD CVE 数据库?
- java - 如何在 Java SOAP 客户端中禁用 SSL 验证
- firebase-remote-config - 延迟应用程序启动,直到 RemoteConfig 返回值
- java - Eclipse中Java项目结构最佳实践
- c# - DotPeek 调试使用附加到进程,没有源代码?
- angular - Angular 6 - 单击或聚焦时调用函数
- bash - bash 在 docker:git 上启动 /bin/sh
- php - MYSQL JOIN 查询与 PHP 循环查询性能
- magento - 获取下拉属性文本 - Magento 2
- python - PyQt5 ValueError:无法将字符串转换为浮点数: