gpt4 book ai didi

c# - .Net 6 System.IO.Compression 问题是否有任何解决方法。 DeflateStream.Read 方法在 .Net 6 中工作不正确,但在旧版本中工作正常

转载 作者:行者123 更新时间:2023-12-02 16:00:15 25 4
gpt4 key购买 nike

这里是真实项目的代码,被问题采用,所以一些数据是硬编码的:

   static void Main(string[] args)
{
Console.WriteLine("Starting. " + Environment.Version);
using (var stream = new FileStream(@"stream_test.txt", FileMode.Open))
{
stream.Position = 0;

// .NET implements Deflate (RFC 1951) but not zlib (RFC 1950),
// so we have to skip the first two bytes.
stream.ReadByte();
stream.ReadByte();

var zipStream = new DeflateStream(stream, CompressionMode.Decompress, true);

// Hardcoded length from real project. In the previous .Net versions this is size of final result
long bytesToRead = (long)262 * 350;

var buffer = new byte[bytesToRead];
int bytesWereRead = zipStream.Read(buffer, 0, (int)bytesToRead);

if (bytesWereRead != bytesToRead)
{
throw new Exception("ZIP stream was not fully decompressed.");
}

Console.WriteLine("Ok");
Console.ReadKey();
}
}

解压缩问题并未出现在每个流中,因此可以在 GitHub 上找到带有项目代码的输入文件。 https://github.com/dimsa/Net6DeflateStreamIssue/tree/main/DeflateStreamTest

此代码在以下情况下正常:

  • .NET Framework(已在 2.0、3.5、4 上测试)
  • .NET 标准 2.1 和
  • .NET 5

.NET 6 失败了。 Net 6中解压后的数据长度错误。

是否有任何解决方法,或者应该使用其他压缩库?

最佳答案

DeflateStream 在 .NET 6 中的运行方式发生了重大变化。您可以阅读更多相关信息和推荐操作 in this Microsoft documentation .

基本上,您需要包装 .Read 操作并检查读取的长度与预期长度,因为该操作现在可能会在读取完整长度之前返回。您的代码可能如下所示(基于文档中的示例):

int totalRead = 0;
var buffer = new byte[bytesToRead];
while (totalRead < buffer.Length)
{
int bytesRead = zipStream.Read(buffer.Slice(totalRead));
if (bytesRead == 0) break;
totalRead += bytesRead;
}

关于c# - .Net 6 System.IO.Compression 问题是否有任何解决方法。 DeflateStream.Read 方法在 .Net 6 中工作不正确,但在旧版本中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70845115/

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