boost :: iostreams中的Zlib压缩与zlib.NET不兼容

时间:2010-05-12 21:27:02

标签: c# compatibility zlib boost-iostreams

我想将C#之间的压缩数据以ZLIB格式发送到C ++应用程序。在C ++中,我使用boost :: iostreams中提供的zlib_compressor / zlib_decompressor。在C#中,我目前正在使用zlib.NET库中提供的ZOutputStream。首先,当我使用两个库压缩相同的数据时,结果看起来不同:

  1. 升压::输入输出流:: zlib_compressor:
  2. 63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00

    1. zlib.NET(zlib.ZOutputStream):
    2. 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中压缩的数据时,它确实有效。

      有人知道出了什么问题吗?

      谢谢,

      约翰

2 个答案:

答案 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/)并且工作正常。