首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET DeflateStream与linux zlib差异

.NET DeflateStream与linux zlib差异
EN

Stack Overflow用户
提问于 2016-06-15 20:45:38
回答 2查看 3K关注 0票数 4

我需要跨平台的压缩/解压之间的Windows和Ubuntu。据我所知,启动.NET 4.5时,类DeflateStream使用zlib作为压缩库。我编写了两个小的测试程序来压缩数据,一个在C#上运行,另一个在运行在Ubuntu上的'C‘中。.NET平台为4.5.2。

C#代码正在使用CompressionLevel.Optimal

C代码正在使用Z_BEST_COMPRESSION

以下是研究结果:

代码语言:javascript
复制
Input bytes: {9, 12, 13}
C# output: {227, 228, 225, 5, 0};
C output:  {120, 218, 227, 228, 225, 5, 0, 0, 67, 0, 35}

如您所见,C#中压缩数据的长度为5字节,其中C为11字节。看起来,'C‘zlib在页眉中增加了2个字节,在页脚中添加了4个额外字节。

如果需要的话,我可以分享代码。但是,它是从您在网络上看到的标准示例中获取的,代码没有什么特别之处。

我是不是遗漏了什么?有办法解决吗?如果页眉和页脚始终保持不变,也许我总是可以添加额外的字节。致以问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-16 11:14:11

首先,您需要理解zlib可以生成三种可能的格式。它们是原始放空(RFC 1951),zlib流被包装在zlib报头和拖车中(RFC 1950),以及gzip流被包装在gzip报头和拖车中(RFC 1952)。您的C#代码正在生成一个原始的放气流,而您的C代码正在生成一个zlib流。

您还没有显示您的代码,但是您可以像DeflateStream那样很容易地使用zlib (在C代码中)生成一个原始的放气流。不幸的是,NET4.5中没有类来生成zlib流(在您的C#代码中)。但是,您可以轻松地创建自己的zlib头和拖车来包装原始的排气流。(见RFC)

但是,我强烈建议您不要使用NET4.5zlib接口例程。而是使用DotNetZip,它为zlib的全部功能提供了一个接口,而且更重要的是,它没有像微软所说的不会修复那样的.NET 4.5中的bug!

票数 8
EN

Stack Overflow用户

发布于 2016-06-15 21:42:10

原来,这是DeflateStream和zlib之间一个非常老的不兼容问题,如这里所提到的:https://tlzprgmr.wordpress.com/2010/03/17/net-deflatestreamzlib-compatibility/

本质上,DeflateStream不会将所需的页眉或页脚添加到压缩数据中。致以问候。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37845440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档