這是來自實際專案的代碼,用于該問題,因此一些資料是硬編碼的:
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 中的解壓資料長度不正確。
是否有任何解決方法,或者應該使用其他壓縮庫?
uj5u.com熱心網友回復:
DeflateStream 在 .NET 6 中的運行方式發生了重大變化。您可以在此 Microsoft 檔案中閱讀有關它的更多資訊以及建議的操作。
基本上,您需要包裝.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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/420915.html
標籤:
上一篇:在泛型方法C#中處理可為空的
下一篇:全屏背景圖片-Wordpress
