2012-09-21 30 views
0

海蘭傢伙,所以以後你幫我正確地轉換「壓縮」功能,我tryed轉換的解壓功能太gZipBuffer減壓轉換爲F#

現在我在這裏 (由我解壓縮功能)

let DecompressString (detext : string) = 
    let buffer = Convert.FromBase64String detext 
    using (new MemoryStream()) <| fun memoryStream -> 
      using (new GZipStream(memoryStream, CompressionMode.Decompress, true)) <| fun gzipStream -> 
      memoryStream.Position <- 0L 
      memoryStream.Read(buffer, 0, Array.length buffer) 
      Encoding.UTF8.GetString(buffer) 

原來Compressfunction是

let compressString (text : string) = 
let buffer = Encoding.UTF8.GetBytes text 
using (new MemoryStream()) <| fun memoryStream -> 
    using (new GZipStream(memoryStream, CompressionMode.Compress, true)) <| fun gzipStream -> 
     gzipStream.Write (buffer, 0, Array.length buffer) 
    memoryStream.Position <- 0L 
    let compressedData = Array.zeroCreate (int memoryStream.Length) 
    memoryStream.Read (compressedData, 0, compressedData.Length) 
    let gzipBuffer = Array.zeroCreate (compressedData.Length + 4) 
    Buffer.BlockCopy (compressedData, 0, gzipBuffer, 4, compressedData.Length) 
    Buffer.BlockCopy (BitConverter.GetBytes buffer.Length, 0, gzipBuffer, 0, 4) 
    Convert.ToBase64String gzipBuffer 

如果我壓縮這樣

字符串
File.WriteAllText("test",compressString("bla")) 

(我保存在這個文件名爲「test」的文件是從「喇嘛」壓縮串)

AwAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyImZfb/ADmz70cDAAAA」 <似乎對我來說更大然後過嗎? :d

確定現在我試着像一次解壓:

File.WriteAllText("test2",DecompressString(File.ReadAllText("test"))) 

,但在新的 「test2的」 文件僅僅是不可讀的文本,如:

?"&e�ï¿

,所以我認爲我的dcompress功能不能正常工作。

也許你的我的英雄能幫助我第二次也是最後一次? :) 無論如何在此先感謝

+0

嗯,如果我看到它壓縮功能只返回一個base64字符串? ,所以我只能使用'Convert.ToBase64String',我只是想要一個「真正的」字符串壓縮... – galeda

回答

1

首先,您正在讀取的內存流是空的,所以沒有什麼會寫入目標緩衝區。

其次,您正在重新使用buffer,它包含base 64字符串參數的字節。

你不能得到一個GZipStream的長度,所以你必須把它複製到另一個存儲流:

let DecompressString (detext : string) = 
    let buffer = Convert.FromBase64String detext 
    using (new MemoryStream()) <| fun memoryStream -> 
     memoryStream.Write(buffer, 0, Array.length buffer) 
     memoryStream.Seek(0L, SeekOrigin.Begin) |> ignore 
     using (new GZipStream(memoryStream, CompressionMode.Decompress, true)) <| fun gzipStream -> 
      using(new MemoryStream()) <| outStream -> 
       gzipStream.CopyTo(outStream) 
       Encoding.UTF8.GetString(outStream.ToArray()) 
+0

Uff好的謝謝你的幫助,但爲什麼我的記憶流是空的? ,所以你的functopn也不工作我得到這裏「let outBuf:byte array = Array.zeroCreate(int gzipStream.Length)」這個異常「這個操作不被支持。」 ,f#嚇我一跳,但我喜歡它:)謝謝你幫助反正它是一個非常好的社區,併爲我的英語感到難過:) – galeda

+0

@galeda - 你的記憶流是空的,因爲你沒有寫任何東西。你的例外是因爲'GZipStream.Length'不被支持。我會盡力找到一個解決方案...... – Lee

+0

Ahhhh你的權利,但爲什麼他給我寫了類似於「解壓縮後的文件」?「&e�ï¿」的東西,如果他清空這個也應該是空的或?,但是謝謝爲你的幫助:) – galeda