2015-10-15 60 views
1

我有很多用Delphi編寫的應用程序製作的文件,我想在C#應用程序中打開。我正在寫作。用c#打開Delphi ZLib壓縮數據#

解包文件的「老」德爾福代碼:

InputStream := TFileStream.Create(InputFileName, fmOpenRead); 
OutputStream := TMemoryObjStream.Create; 
DecompressionStream := TZDecompressionStream.Create(InputStream); 
OutputStream.CopyFrom(DecompressionStream, 0); 

這是我用在C#中打開這些文件中的代碼:

FS = new System.IO.FileStream(File, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read); 
System.IO.MemoryStream MS = new System.IO.MemoryStream(); 
ZLibNet.ZLibStream ZS = new ZLibNet.ZLibStream(S, ZLibNet.CompressionMode.Decompress); 
ZS.CopyTo(MS); 
ZS.Close(); 
FS.close(); 

如果我現在開始閱讀「MS流」與二進制閱讀器 我得到了一些奇怪的數據在前24個字節,然後我得到的值似乎是合乎邏輯的。
首先它應該讀取一個Int32,它具有合理的價值。 之後,一個字符串,這個字符串顯示爲「\ 0 \ 0 \ 0ISua」,我期待「ISuarez」。但是如果我將流位置進一步移動一個字節,我會得到「Suarez \ n \ 0 \ 0 \ 0」
這讓我想知道我是否可能會稍後開始讀取流而不是字節,但如何執行此操作?

+0

這是zlib而不是ZIP。我認爲你需要弄清楚壓縮文件中有哪些頭文件。 –

回答

0

我一直在這個問題上擱置了一段時間,最近做了另外一個試圖解決它,並發現了什麼是錯誤的:

德爾福的字符串後面的字符長度寫入一個32位整數。

Binaryreader.Readstring在.net中,另一方面,讀取一個字節由7相乘得到的字符串的長度,聲明爲什麼我的前3個字符,其中空字符「0 \」

所以我寫了我自己的字符串讀取器:

enter code here 
     private String ReadString(System.IO.BinaryReader BR) 
    { 
     Int32 StringLength = BR.ReadInt32(); 
     Char[] Chars = BR.ReadChars(StringLength); 
     return new String(Chars); 
    } 

而且這工作正常。

此致敬禮!

0

嗨,我們有類似的問題。 .net中的Zlib不是Zlib。我們發現了超過10個帶有「zlib」標籤的Lib,但是它們不能像delphi一樣進行壓縮/解壓縮。

我們努力在版本1.0.4.0中使用nuget包「zlib.net」。 這對我們有效。

0

真正的問題是什麼是壓縮數據,你不顯示,但:

我有一個場景,我在Delphi壓縮數據,並在C#中讀取它需要的。這是跳過前兩個字節的一個簡單問題,因爲Delphi中的zlib庫在頭文件中使用了兩個字節,而C#中的Deflate例程沒有。