首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C#到F#的gZipBuffer DECompression转换

从C#到F#的gZipBuffer DECompression转换
EN

Stack Overflow用户
提问于 2012-09-22 02:46:49
回答 1查看 346关注 0票数 0

你们好,所以在你们帮助我正确地转换“压缩”函数后,我也尝试转换了解压缩函数

现在我在这里(由我解压函数)

代码语言:javascript
复制
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为

代码语言:javascript
复制
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

如果我像这样压缩一个字符串

代码语言:javascript
复制
File.WriteAllText("test",compressString("bla"))

(我保存了名为"test“的文件,该文件是来自”bla“的压缩字符串)

"AwAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyImZfb/ADmz70cDAAAA“<对我来说比以前更大?:D

好的,现在我尝试再次解压,如下所示:

代码语言:javascript
复制
File.WriteAllText("test2",DecompressString(File.ReadAllText("test")))

但在新的"test2“文件中,只有无法阅读的文本,如:

"?"&e�ï¿

所以我认为我的dcompress函数不能正常工作。

也许你我的英雄们能帮我第二次也是最后一次?:)不管怎样,提前谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-22 03:43:04

首先,您正在读取的内存流是空的,因此不会向目标缓冲区写入任何内容。

其次,您重用了buffer,它包含了base64字符串参数的字节。

您无法获得GZipStream的长度,因此您必须将其复制到另一个内存流中:

代码语言:javascript
复制
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())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12536434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档