2010-05-12 113 views
3

我想將C#之間的壓縮數據發送到ZLIB格式的C++應用程序。在C++中,我使用boost :: iostreams中提供的zlib_compressor/zlib_decompressor。在C#中,我正在使用zlib.NET庫中的ZOutputStream。首先,當我壓縮使用兩個庫相同的數據,結果看起來不同:Zlib壓縮boost :: iostreams與zlib.NET不兼容

  1. 升壓::輸入輸出流:: zlib_compressor:

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

  • 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中存在的78 9C模式,但不在boost中)。

    此外,當我在zlib.NET中壓縮的boost中解壓縮數據時,我無法從流中讀取表明存在錯誤的流。當我嘗試解壓縮以boost壓縮的數據時它確實工作。

    有人知道發生了什麼問題嗎?

    謝謝

    約翰

    回答

    0

    我還沒有想通了,爲什麼zlib.NET不與升壓輸入輸出流兼容的,但我沒有找到一個解決方案:我現在用的DotNetZip(http://dotnetzip.codeplex.com/)和工作正常。

    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命令在「原始癟」格式擴展數據。)

    +0

    另外值得注意的是,由於底層庫支持它們,所以boost庫似乎很難將非原始格式放在默認範圍之外。一定是某種哲學的東西,我想逃避我。 – 2010-05-13 08:30:08

    +0

    謝謝,很好的幫助。事實證明,我已經通過no_header選項來偶然提升...... Doh! – Johan 2010-05-14 07:49:38