Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gZipBuffer解压缩从C#转换为F#_F# - Fatal编程技术网

gZipBuffer解压缩从C#转换为F#

gZipBuffer解压缩从C#转换为F#,f#,F#,嘿,伙计们,在你们帮我正确地转换了“压缩”函数之后,我也尝试了转换解压函数 现在我在这里 (我的解压功能) (我在这个文件中保存名为“test”的文件是“bla”中的压缩字符串) “AwAAAB+lcaaaaaabadtvqdghenghemwjsyvbcp7f0r1stfgdkeigatjniqbdswyjn5plshwlhiymrkozvzlxwywqmztnbz33nvvvffee++997o7nU4n99//p1xmzafs9s5k2kmeiycqyb8/fnwfPyImZfb/admz

嘿,伙计们,在你们帮我正确地转换了“压缩”函数之后,我也尝试了转换解压函数

现在我在这里 (我的解压功能)

(我在这个文件中保存名为“test”的文件是“bla”中的压缩字符串)

AwAAAB+lcaaaaaabadtvqdghenghemwjsyvbcp7f0r1stfgdkeigatjniqbdswyjn5plshwlhiymrkozvzlxwywqmztnbz33nvvvffee++997o7nU4n99//p1xmzafs9s5k2kmeiycqyb8/fnwfPyImZfb/admz70cdaaa
”<对我来说似乎比以前更大了?:D

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

File.WriteAllText("test2",DecompressString(File.ReadAllText("test")))
但在新的“test2”文件中,只有不可读的文本,如:

?”&eïï½ïï

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

也许你的“我的英雄”能帮我第二次也是最后一次吗?:)
无论如何,请提前感谢

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

其次,您使用的是
buffer
,其中包含base64字符串参数的字节

无法获取
gzip流的长度,因此必须将其复制到另一个内存流:

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())
let DecompressString(detext:string)=
让buffer=Convert.fromBase64字符串detext
使用(新内存流())
memoryStream.Write(缓冲区,0,数组长度缓冲区)
memoryStream.Seek(0L,SeekOrigin.Begin)|>忽略
使用(新的GZipStream(memoryStream,CompressionMode.Decompresse,true))
使用(新的MemoryStream())
gzipStream.CopyTo(扩展)
Encoding.UTF8.GetString(outStream.ToArray())

Hmm如果我看得对,compress函数只返回base64字符串?,所以我可以使用“Convert.ToBase64String”,我只是想要一个“真正的”字符串压缩…Uff好的,谢谢你的帮助,但是为什么我的memorystream是空的?所以你的functon也不能工作,我到这里“let extuff:byte array=array.zeroCreate(int gzipStream.Length)“此异常”不支持此操作。“,f#吓到我了,但我喜欢它:)谢谢你的帮助无论如何这是一个非常好的社区,对不起我的英语:)@galeda-你的内存流是空的,因为你没有写任何东西给它。您的异常是因为不支持
GZipStream.Length
。我会设法找到一个解决办法……啊,你说得对,但他为什么在“解压”文件中给我写这样的东西?“&eï½ï?”“如果他是空的,这也应该是空的,或者?”,但感谢您的帮助:)@galeda-问题是您实际上是在将base 64字符串视为UTF-8字符串,这就是为什么会将垃圾返回给您的原因。将基64字节读入缓冲区,然后将空内存流读入缓冲区的开头。这没有任何作用,所以您实际上是在执行
Convert.FromBase64String detext |>编码.UTF8.GetString
好的,我理解,但这没有意义,或者?我将压缩一个字符串,不将其转换为utf/base64等。这是无用的,谢谢大家的帮助:)
File.WriteAllText("test",compressString("bla"))
File.WriteAllText("test2",DecompressString(File.ReadAllText("test")))
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())