代码之家  ›  专栏  ›  技术社区  ›  leppie

使用GZip往返截断1个或多个字节

  •  3
  • leppie  · 技术社区  · 16 年前

    我写了一个简单的测试来验证其他东西不会影响它。

    麻风病人

    using System;
    using System.Diagnostics;
    using System.IO;
    using System.IO.Compression;
    
    class Program
    {
      const int BUFFER_SIZE = 8192;
    
      static void Main(string[] args)
      {
        var filename = args[0];
        var filedata = File.ReadAllBytes(filename);
        var cmp = Compress(filedata);
        var dec = Decompress(cmp);
    
        Assert(filedata, dec);
    
        Console.ReadLine();
      }
    
      static void Assert(byte[] orig, byte[] data)
      {
        if (orig.Length != data.Length)
        {
          Debug.Fail("length mismatch");
        }
        for (int i = 0; i < orig.Length; i++)
        {
          Debug.Assert(orig[i] == data[i], "data mismatch");
        }
      }
    
      static byte[] Compress(byte[] data)
      {
        var input = new MemoryStream(data);
        var output = new MemoryStream();
    
        var s = new GZipStream(output, CompressionMode.Compress);
        byte[] buffer = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
          s.Write(buffer, 0, read);
        }
    
        return output.ToArray();
      }
    
      static byte[] Decompress(byte[] data)
      {
        var input = new MemoryStream(data);
        var s = new GZipStream(input, CompressionMode.Decompress);
    
        var output = new MemoryStream();
        byte[] buffer = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = s.Read(buffer, 0, buffer.Length)) > 0)
        {
          output.Write(buffer, 0, read);
        }
    
        return output.ToArray();
      }
    }
    

    我也尝试过正确关闭流,使用不同的缓冲区大小,结果都是一样的。

    1 回复  |  直到 16 年前
        1
  •  3
  •   leppie    16 年前

    在检索字节之前,您需要关闭压缩流。

    如:

    s.Close();
    return output.ToArray();