如何使用fstream
将输出写入压缩文件(gz,bz2,...)?似乎Boost库可以做到这一点,但我正在寻找一个非Boost解决方案。我只看到了从压缩文件中读取的示例。
答案 0 :(得分:3)
要将压缩数据写入文件,您可以通过压缩库运行未压缩的数据,例如zlib(对于DEFLATE,与.zip和.gz文件一起使用的压缩算法)或xz utils (对于LZMA,与7zip和.xz文件一起使用的压缩算法),然后使用ofstream
或fwrite
照常写入结果。
答案 1 :(得分:2)
要实施的两个主要部分是encoding/compression和framing/encapsulation/file format。
来自维基百科,DEFLATE算法:
流格式
Deflate流由一系列块组成。每个街区都是 前面有一个3位标头:1位:最后一个块流标记:1: 这是流中的最后一个块。 0:有更多的块 这之后的过程。 2位:用于此块的编码方法 type:00:存储/ raw / literal部分,介于0到65,535字节之间 长度。 01:静态霍夫曼压缩块,使用预先约定的 哈夫曼树。 10:使用霍夫曼表完成的压缩块 提供。 11:保留,不要使用。大多数街区最终会成为 使用方法10编码,动态霍夫曼编码,其产生 为每个数据块定制的优化霍夫曼树 个别。生成必要的霍夫曼树的说明 紧跟块标题。压缩是通过实现的 两个步骤匹配和替换重复的字符串 指针。用基于的新加权符号替换符号 使用频率。
来自维基百科,gzip
文件格式:
“gzip”通常也用于指代gzip文件格式,即: 一个10字节的标题,包含一个幻数,一个版本号和一个 timestamp可选的额外标头,例如原始文件名,a body,包含一个DEFLATE压缩的有效负载,一个8字节的页脚, 包含CRC-32校验和和原始长度 未压缩数据