使用fstream写入gz

writing to gz using fstream

本文关键字:gz 写入 fstream 使用      更新时间:2023-10-16

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

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

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

来自维基百科的DEFLATE算法:

流格式

放气流由一系列块组成。每个区块前面是3位标头:1位:流标记中的最后一个块:1:这是流中的最后一个块。0:还有更多块在这个过程之后。2位:用于此块的编码方法类型:00:存储的/raw/literal节,介于0和65535字节之间长01:静态霍夫曼压缩块,使用预先商定的霍夫曼树。10:一个带有霍夫曼表的压缩块提供。11:预留,不用。大多数区块最终将使用方法10进行编码,即动态霍夫曼编码,产生为每个数据块定制的优化霍夫曼树单独。生成必要的霍夫曼树的说明立即跟随块标头。压缩是通过两个步骤用匹配和替换重复字符串指针。使用基于的新的加权符号替换符号使用频率。

从维基百科,gzip文件格式:

"gzip"也经常被用来指代gzip文件格式,它是:一个10字节的标头,包含一个幻数、一个版本号和一个timestamp可选的额外标头,如原始文件名、主体,包含DEFLATE压缩的有效载荷一个8字节的页脚,包含CRC-32校验和和和原始长度未压缩数据