3

C# と C++ アプリケーションの間で圧縮されたデータを ZLIB 形式で送信したいと考えています。C++ では、boost::iostreams で利用可能な zlib_compressor/zlib_decompressor を使用します。C# では、現在 zlib.NET ライブラリで利用可能な ZOutputStream を使用しています。まず、両方のライブラリを使用して同じデータを圧縮すると、結果が異なって見えます。

  1. ブースト::iostreams::zlib_compressor:

63 61 60 60 F8 00 C4 C1 25 45 99 79 E9 23 87 04 00

  1. zlib.NET (zlib.ZOutputStream):

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 には存在するが、boost には存在しない 78 9C パターンに注意してください)。

さらに、zlib.NET で圧縮したデータを boost で解凍すると、ストリームから読み取ることができず、何か問題があることが示唆されます。ブーストで圧縮されたデータを解凍しようとすると機能します。

誰が何がうまくいかないのか知っていますか?

ありがとうございました、

ヨハン

4

1 に答える 1

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コマンドはデータを「compress」形式でzlib inflate展開し、コマンドはデータを「raw deflated」形式で展開します。)

于 2010-05-13T08:15:02.577 に答える