使用fstream写入gz
writing to gz using fstream
如何使用fstream
将输出写入压缩文件(gz,bz2,…)?看起来Boost库可以做到这一点,但我正在寻找一个非Boost的解决方案。我只看到了从压缩文件中读取的示例。
要将压缩数据写入文件,您需要通过压缩库运行未压缩数据,例如zlib(对于DEFLATE,与.zip和.gz文件一起使用的压缩算法)或xz-utils(对于LZMA,与7zip和.xz文件一起用的压缩算法,),然后像往常一样使用ofstream
或fwrite
写入结果。
要实现的两个主要部分是编码/压缩和成帧/封装/文件格式。
来自维基百科的DEFLATE算法:
流格式
放气流由一系列块组成。每个区块前面是3位标头:1位:流标记中的最后一个块:1:这是流中的最后一个块。0:还有更多块在这个过程之后。2位:用于此块的编码方法类型:00:存储的/raw/literal节,介于0和65535字节之间长01:静态霍夫曼压缩块,使用预先商定的霍夫曼树。10:一个带有霍夫曼表的压缩块提供。11:预留,不用。大多数区块最终将使用方法10进行编码,即动态霍夫曼编码,产生为每个数据块定制的优化霍夫曼树单独。生成必要的霍夫曼树的说明立即跟随块标头。压缩是通过两个步骤用匹配和替换重复字符串指针。使用基于的新的加权符号替换符号使用频率。
从维基百科,gzip
文件格式:
"gzip"也经常被用来指代gzip文件格式,它是:一个10字节的标头,包含一个幻数、一个版本号和一个timestamp可选的额外标头,如原始文件名、主体,包含DEFLATE压缩的有效载荷一个8字节的页脚,包含CRC-32校验和和和原始长度未压缩数据
相关文章:
- 写入向量<向量<bool>>
- 如何将内容数组写入文本文件?
- 写入位置0x0000000C时发生访问冲突
- 使用ios:ate写入到流会覆盖现有文件
- 独立读取-修改-写入顺序
- 为什么在某些情况下不写入此文件?
- 用C++将哈希表写入文件并从文件中恢复
- std::当在256字节边界上写入整数时,流的奇怪行为
- 为什么指针不写入类的地址?
- 如何打开并写入一个名称取自C++中字符串的文件
- 如何在C++中从文件中读取/写入多个对象
- 链表中写入访问冲突的未知原因
- 着色器纹理值与创建纹理时写入的值不同
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 在C++中一次将矢量值写入多个文件
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 写入文件会产生一个空文件或根本没有文件
- std::带有自定义缓冲区的 iostream 不允许我写入
- 使用fstream写入gz
- 用boost写入一个gz流