예제 #1
0
파일: ZLib.cs 프로젝트: Moonstriker/Kuriimu
        public static byte[] Compress(Stream instream, CompressionLevel compressionLevel = CompressionLevel.Optimal, bool leaveOpen = false)
        {
            var inData = new BinaryReaderX(instream, leaveOpen).ReadBytes((int)instream.Length);
            var ms     = new MemoryStream();

            ms.Write(new byte[] { 0x78, 0xDA }, 0, 2);
            using (var ds = new DeflateStream(ms, compressionLevel, true))
                ds.Write(inData, 0, inData.Length);
            var adler = inData.Aggregate(Tuple.Create(1, 0), (x, n) => Tuple.Create((x.Item1 + n) % 65521, (x.Item1 + x.Item2 + n) % 65521));

            ms.Write(new[] { (byte)(adler.Item2 >> 8), (byte)adler.Item2, (byte)(adler.Item1 >> 8), (byte)adler.Item1 }, 0, 4);
            return(ms.ToArray());
        }