2

如何使用 将输出写入压缩文件(gz、bz2、...)fstream?似乎 Boost 库可以做到这一点,但我正在寻找一个非 Boost 解决方案。我看到的示例仅用于从压缩文件中读取。

4

2 回答 2

3

要将压缩数据写入文件,您可以通过压缩库运行未压缩的数据,例如zlib(对于 DEFLATE,用于 .zip 和 .gz 文件的压缩算法)或xz utils(对于 LZMA,用于 7zip 的压缩算法和 .xz 文件),然后像往常一样使用ofstreamor写入结果fwrite

于 2012-11-30T16:20:20.837 回答
2

要实现的两个主要部分是编码/压缩成帧/封装/文件格式

来自维基百科,DEFLATE 算法:

流格式

Deflate 流由一系列块组成。每个块前面都有一个 3 位标头: 1 位:流中的最后一个块标记:1:这是流中的最后一个块。0:在这之后还有更多的块要处理。2 位:用于此块类型的编码方法: 00:存储/原始/文字部分,长度在 0 到 65,535 字节之间。01:静态霍夫曼压缩块,使用预先约定的霍夫曼树。10:一个完整​​的压缩块,附带提供的霍夫曼表。11:保留,不要使用。大多数块最终将使用方法 10 进行编码,即动态 Huf​​fman 编码,它会为每个数据块单独定制优化的 Huffman 树。生成必要的霍夫曼树的指令紧跟在块头之后。压缩是通过两个步骤实现的:用指针匹配和替换重复字符串。根据使用频率用新的加权符号替换符号。

来自维基百科,gzip文件格式:

“gzip”也常用于指代gzip文件格式,即:一个10字节的header,包含一个magic number、一个version number和一个timestamp 可选的额外headers,比如原始文件名,body,包含DEFLATE-compressed payload 一个 8 字节的页脚,包含 CRC-32 校验和和原始未压缩数据的长度

于 2012-11-30T16:22:08.453 回答