C语言gzip字节流压缩,关于使用zlib到缓冲区的c:GZIP压缩

我想使用gzip压缩内存缓冲区,然后将压缩后的字节放入另一个内存缓冲区。 我想使用Content-Encoding: gzip在HTTP数据包的有效负载中发送压缩缓冲区。 我可以轻松地使用zlib进行放气压缩(compress() function)。 但是,没有我需要的API(gzip)。 zlib API将压缩并写入文件(gzwrite())。 但是,我想压缩并写入缓冲区。

有任何想法吗?

我在Linux上使用C语言。

AFAIK,zlibs gz API需要真实的FD,open_memstream是否会映射提供的缓冲区? 在这种情况下,您确定文件具有有效的fd吗?

如何使用zlib压缩缓冲区的可能重复项?

不,zlib API实际上确实通过deflate函数在内存中提供gzip压缩。您实际上需要阅读zlib.h中的文档。

最初我在听到名字:D时感到困惑,您当然是对的,"基本"功能将实现这一目标。

deflate()默认情况下以zlib格式工作,要启用gzip压缩,您需要使用deflateInit2()向windowBits"添加16",如以下代码所示,windowBits是切换为gzip格式的关键

// hope this would help

int compressToGzip(const char* input, int inputSize, char* output, int outputSize)

{

z_stream zs;

zs.zalloc = Z_NULL;

zs.zfree = Z_NULL;

zs.opaque = Z_NULL;

zs.avail_in = (uInt)inputSize;

zs.next_in = (Bytef *)input;

zs.avail_out = (uInt)outputSize;

zs.next_out = (Bytef *)output;

// hard to believe they don't have a macro for gzip encoding,"Add 16" is the best thing zlib can do:

//"Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper"

deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY);

deflate(&zs, Z_FINISH);

deflateEnd(&zs);

return zs.total_out;

}

标头中的一些相关内容:

"该库可以选择在其中读写gzip和原始deflate流

记忆。"

"在windowBits中添加16,以便在

压缩数据而不是zlib包装器"

deflateInit2()的有趣文档距其定义还有1000多行,除非必须,否则我不会再准备文档。

欢迎使用StackOverflow。 请说明您的代码如何解决该问题,并提供一些有关代码工作方式的说明。

Gzip是一种文件格式,这就是为什么提供的实用程序功能可以在fd上运行的原因,请使用shm_open()创建具有足够内存的fd mmap()。重要的是要写入的数据不要扩展映射区域的大小,否则写入将失败。这是映射区域的限制。

将fd传递给gzdopen()。

但正如Mark在其答案中所建议的那样,使用Basic API接口是一种更好的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值