gpt4 book ai didi

c# - DeflateStream 不解压数据(第一次)

转载 作者:太空狗 更新时间:2023-10-29 19:38:01 25 4
gpt4 key购买 nike

所以这是一个奇怪的。我有这个方法来获取 Base64 编码的压缩字符串并返回原始数据:

public static string Base64Decompress(string base64data)
{
byte[] b = Convert.FromBase64String(base64data);
using (var orig = new MemoryStream(b))
{
using (var inflate = new MemoryStream())
{
using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
{
ds.CopyTo(inflate);
return Encoding.ASCII.GetString(inflate.ToArray());
}
}
}
}

这将返回一个空字符串除非我再次调用ds.CopyTo(inflate)。 (卧槽?)

   ...
using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
{
ds.CopyTo(inflate);
ds.CopyTo(inflate);
return Encoding.ASCII.GetString(inflate.ToArray());
}
...

(Flush/Close/Disposeds 无效。)

为什么 DeflateStream 在第一次调用时复制 0 个字节?我也尝试过使用 Read() 进行循环,但它在第一次调用时也返回零,然后在第二次调用时返回零。


更新:这是我用来压缩数据的方法。

public static string Base64Compress(string data, Encoding enc)
{
using (var ms = new MemoryStream())
{
using (var ds = new DeflateStream(ms, CompressionMode.Compress))
{
byte[] b = enc.GetBytes(data);
ds.Write(b, 0, b.Length);
ds.Flush();
return Convert.ToBase64String(ms.ToArray());
}
}
}

最佳答案

当压缩字节不完整时(即并非所有 block 都被写出),就会发生这种情况。

如果我将您的 Base64Compress 与以下解压缩方法一起使用,我将收到一个 InvalidDataException 消息“未知 block 类型。流可能已损坏。'

解压

public static string Decompress(Byte[] bytes)
{
using (var uncompressed = new MemoryStream())
using (var compressed = new MemoryStream(bytes))
using (var ds = new DeflateStream(compressed, CompressionMode.Decompress))
{
ds.CopyTo(uncompressed);
return Encoding.ASCII.GetString(uncompressed.ToArray());
}
}

请注意,使用以下 Compress 方法时,一切都按预期工作

public Byte[] Compress(Byte[] bytes)
{
using (var memoryStream = new MemoryStream())
{
using (var deflateStream = new DeflateStream(memoryStream, CompressionMode.Compress))
deflateStream.Write(bytes, 0, bytes.Length);

return memoryStream.ToArray();
}
}

更新

哎呀,愚蠢的我......你不能 ToArray 内存流,直到你处理 DeflateStream(因为 flush 实际上没有实现(和 Deflate/GZip 压缩数据 block );最后的 block 只写在关闭/处理。

重写 compress 为:

public static string Base64Compress(string data, Encoding enc)
{
using (var ms = new MemoryStream())
{
using (var ds = new DeflateStream(ms, CompressionMode.Compress))
{
byte[] b = enc.GetBytes(data);
ds.Write(b, 0, b.Length);
}

return Convert.ToBase64String(ms.ToArray());
}
}

关于c# - DeflateStream 不解压数据(第一次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4158942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com