我需要跨平台的压缩/解压之间的Windows和Ubuntu。据我所知,启动.NET 4.5时,类DeflateStream使用zlib作为压缩库。我编写了两个小的测试程序来压缩数据,一个在C#上运行,另一个在运行在Ubuntu上的'C‘中。.NET平台为4.5.2。
C#代码正在使用CompressionLevel.Optimal
C代码正在使用Z_BEST_COMPRESSION
以下是研究结果:
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个额外字节。
如果需要的话,我可以分享代码。但是,它是从您在网络上看到的标准示例中获取的,代码没有什么特别之处。
我是不是遗漏了什么?有办法解决吗?如果页眉和页脚始终保持不变,也许我总是可以添加额外的字节。致以问候。
发布于 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!
发布于 2016-06-15 21:42:10
原来,这是DeflateStream和zlib之间一个非常老的不兼容问题,如这里所提到的:https://tlzprgmr.wordpress.com/2010/03/17/net-deflatestreamzlib-compatibility/
本质上,DeflateStream不会将所需的页眉或页脚添加到压缩数据中。致以问候。
https://stackoverflow.com/questions/37845440
复制相似问题