Pet*_*ter 3 .net compression zlib
我需要Windows和Ubuntu之间的跨平台压缩/解压缩.据我所知,从.NET 4.5开始,类DeflateStream使用zlib作为压缩库.我编写了两个小的测试程序来压缩数据,一个在C#上运行在Windows上,另一个在'C'上运行在Ubuntu上..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}
Run Code Online (Sandbox Code Playgroud)
如您所见,C#中压缩数据的长度为5个字节,其中C为11个字节.似乎'C'zlib在页眉中添加2个额外字节,在页脚中添加4个额外字节.
如果需要,我可以共享代码.但是,它取自您在网上看到的标准示例,并且代码没有任何特殊之处.
我错过了什么吗?有办法解决吗?如果页眉和页脚总是保持不变,也许我总是可以添加额外的字节.问候.
首先,您需要了解zlib可以生成三种可能的格式.它们是原始deflate(RFC 1951),一个zlib流,它是一个包含在zlib头和尾部(RFC 1950)中的原始deflate,以及一个gzip流,它是一个包含在gzip头和尾部(RFC 1952)中的原始deflate.您的C#代码正在生成原始deflate流,而您的C代码正在生成zlib流.
您没有显示您的代码,但您可以轻松地使用zlib(在您的C代码中)生成原始deflate流,就像DeflateStream这样.不幸的是,.NET 4.5中没有类来生成zlib流(在您的C#代码中).但是,您可以轻松创建自己的zlib标头和预告片以包装原始deflate流.(参见RFC.)
但是,我强烈建议您根本不使用.NET 4.5 zlib接口例程.使用DotNetZip,它提供了zlib的全部功能的接口,以及更多,最重要的是没有像.NET 4.5中的错误,微软已经说过他们不会修复!