我想将C#之间的压缩数据以ZLIB格式发送到C ++应用程序。在C ++中,我使用boost :: iostreams中提供的zlib_compressor / zlib_decompressor。在C#中,我目前正在使用zlib.NET库中提供的ZOutputStream。首先,当我使用两个库压缩相同的数据时,结果看起来不同:
63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00
78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D
(注意zlib.NET中存在的78 9C模式,但不包括在boost中。)
此外,当我在zlib.NET中压缩的boost中解压缩数据时,我无法从流中读取表明存在错误的内容。当我尝试解压缩在boost中压缩的数据时,它确实有效。
有人知道出了什么问题吗?
谢谢,
约翰
答案 0 :(得分:3)
这是因为boost :: iostreams :: zlib_compressor代码正在生成原始的缩减数据,而zlib.NET正在添加页眉和页脚,以便数据采用压缩格式。
有关证据,请考虑Tcl会话的此日志:
% set s {78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D}
78 9C 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00 4F 31 63 8D
% set b [binary format H* [join $s ""]];string length $b
23
% zlib decompress $b
ðStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringString
% zlib inflate $b
data error
% set s {63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00}
63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00
% set b [binary format H* [join $s ""]];string length $b
17
% zlib decompress $b
data error
% zlib inflate $b
ðStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringStringString
(zlib decompress
命令以“压缩”格式扩展数据,zlib inflate
命令以“原始放气”格式扩展数据。)
答案 1 :(得分:0)
我还没弄清楚为什么zlib.NET与Boost iostream不兼容,但我确实找到了一个解决方案:我现在正在使用DotNetZip(http://dotnetzip.codeplex.com/)并且工作正常。