89007


以下のようなTestCompressという関数を定義しました。

**処理の流れ**

  * 長さlのbyte型の配列bytesにランダムな値を書き込む
  * DeflateStreamで圧縮してデータをcompressedBytesに格納
  * 圧縮されたデータをDeflateStreamを使用して展開し、decompressedBytesに格納
  * bytesとdecompressedBytesを比較し、異なっていた場合は例外をスローする

変数lの値を変えて複数回実行したところ、ターゲットフレームワークが.NET5.0の時は正常に終了しますが、.NET6.0に変更して実行するとlの値が9000を超えたあたりで例外がスローされます。

これは.NET5.0から.NET6.0にバージョンが変わったことでDeflateStreamの動作が何か変わったのでしょうか？

[code]

    using System.IO;
    using System.IO.Compression;
    
    public static void TestCompress()
    {
        var r = new Random();
        int l = 7000;
        var bytes = new byte[l];
        r.NextBytes(bytes);
        byte[] compressedBytes;
        using (var memSt1 = new MemoryStream())
        {
            using (var comp = new DeflateStream(memSt1, CompressionLevel.Optimal, true))
            {
                comp.Write(bytes, 0, l);
            }
            compressedBytes = memSt1.ToArray();
        }
    
        var decompressedBytes = new byte[l];
        using (var memSt2 = new MemoryStream(compressedBytes))
        {
            using (var decomp = new DeflateStream(memSt2, CompressionMode.Decompress, true))
            {
                decomp.Read(decompressedBytes, 0, l);
            }
        }
    
        for (int i = 0; i < l; i++)
        {
            if (decompressedBytes[i] != bytes[i])
            {
                throw new Exception();
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2022-05-23T14:00:41.667
89006
2022-05-23T22:48:23.563
2022-05-23T21:44:45.330
52766
52766
question
c# .net
.NET6.0のSystem.IO.Compression.DeflateStreamの挙動について


原因は、kunifさんが紹介されている通り

  * [.NET 6 での破壊的変更](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/6.0?toc=%2Fdotnet%2Ffundamentals%2Ftoc.json&bc=%2Fdotnet%2Fbreadcrumb%2Ftoc.json)
    * [DeflateStream、GZipStream、CryptoStream での部分的な読み取りとゼロバイトの読み取り](https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/core-libraries/6.0/partial-byte-reads-in-streams)

で説明されています。`NetworkStream`などと同様に、１回のリクエストで要求したバイト数全てが返されるとは限りません。

期待するサイズが得られるまでリクエストを繰り返す必要があります。ちょうど[`BinaryReader.ReadBytes`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.io.binaryreader.readbytes?view=net-6.0#system-io-
binaryreader-readbytes\(system-int32\))がそれをやってくれます。

[code]

    public static void TestCompress() {
        var r = new Random();
        int l = 7000;
        var bytes = new byte[l];
        r.NextBytes(bytes);
    
        byte[] compressedBytes;
        {
            using var memSt1 = new MemoryStream();
            using var comp = new DeflateStream(memSt1, CompressionLevel.Optimal, true);
            comp.Write(bytes, 0, l);
            compressedBytes = memSt1.ToArray();
        }
    
        byte[] decompressedBytes;
        {
            using var memSt2 = new MemoryStream(compressedBytes);
            using var decomp = new DeflateStream(memSt2, CompressionMode.Decompress, true);
            using var reader = new BinaryReader(decomp, Encoding.UTF8, true);
            decompressedBytes = reader.ReadBytes(l);
        }
    
        if (!bytes.SequenceEqual(decompressedBytes))
            throw new Exception();
    }
    
[/code]


CC BY-SA 4.0
2022-05-23T21:04:27.160
89007
2022-05-23T22:48:23.563
2022-05-23T22:48:23.563
4236
4236
89006
answer