使用fstream写入gz

时间:2012-11-30 16:14:58

标签: c++ fstream gz

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

要实施的两个主要部分是encoding/compressionframing/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校验和和原始长度   未压缩数据