0

ハイガイ、「圧縮」機能を適切に変換するのを手伝ってくれた後、解凍機能も変換しようとしました

今ここにいます(私による解凍機能)

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」という名前のファイルを保存します。このファイルは「bla」から圧縮された文字列です)

" AwAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyImZfb/ADmz70cDAAAA" < 前より大きく見える?:D

さて、次のようにもう一度解凍しようとします:

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

しかし、新しい「test2」ファイルには、次のような判読できないテキストのみがあります。

" ?"&e�ï¿"

私のdcompress関数が正しく機能しないと思います。

多分あなたの私のヒーローは二度目と最後に私を助けることができますか? :) とにかく事前に感謝します

4

1 に答える 1

1

まず、読み取り元のメモリ ストリームが空であるため、宛先バッファーには何も書き込まれません。

次に、再利用してbufferおり、これには base 64 文字列引数のバイトが含まれています。

a の長さを取得できないため、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())
于 2012-09-21T19:43:04.250 に答える