Ejemplo n.º 1
0
 private byte[] UEzlCompress(byte[] input, ZLibNet.CompressionLevel level)
 {
     byte[] buffer = null;
     using (var data = new MemoryStream())
     {
         var zlib = new ZLibNet.ZLibStream(data, ZLibNet.CompressionMode.Compress, ZLibNet.CompressionLevel.BestCompression);
         zlib.Write(input, 0, input.Length);
         zlib.Flush();
         buffer = data.GetBuffer();
     }
     return(buffer);
 }
 public static byte[] CompressToZlib(byte[] buffer)
 {
     using (MemoryStream compressStream = new MemoryStream())
     {
         using (ZLibNet.ZLibStream gz = new ZLibNet.ZLibStream(compressStream, ZLibNet.CompressionMode.Compress, ZLibNet.CompressionLevel.Level6, true))
         {
             gz.Write(buffer, 0, buffer.Length);
             compressStream.Seek(0, SeekOrigin.Begin);
             byte[] compressBuffer = new byte[compressStream.Length];
             compressStream.Read(compressBuffer, 0, compressBuffer.Length);
             return(compressBuffer);
         }
     }
 }
Ejemplo n.º 3
0
        public override void SaveChunkToStream(Stream s)
        {
            long sizeOffset, tempOffset;

            Write4(s, (uint)Id.File);
            sizeOffset = s.Position;
            s.Seek(4, SeekOrigin.Current);
            byte[] hash = MD5.Create().ComputeHash(Data);
            WriteArray(s, hash);
            WriteArray(s, new byte[] { 0x00, 0x00, 0x00, 0x00 });
            Write2(s, Permissions);
            Write2(s, Unknown); //WriteArray(s, new byte[] { 0xFF, 0xFF });
            Write4(s, (uint)Data.Length);
            Write1(s, (byte)(IsCompressed ? 1 : 0));
            WriteString(s, Name);
            WriteString(s, Date);
            WriteString(s, Time);

            if (IsCompressed == true)
            {
                int index   = 0;
                int reaming = (int)Data.Length;
                if (Data.Length > 0)
                {
                    do
                    {
                        int blockSize = 0;

                        if (reaming > 0x00100000)
                        {
                            blockSize = 0x00100000;
                        }
                        else
                        {
                            blockSize = reaming;
                        }

                        MemoryStream       compressed = new MemoryStream();
                        ZLibNet.ZLibStream compressor = new ZLibNet.ZLibStream(compressed, ZLibNet.CompressionMode.Compress, ZLibNet.CompressionLevel.BestCompression);
                        compressor.Write(Data, index, blockSize);
                        compressor.Flush();
                        byte[] compressedArray = new byte[compressed.Length];
                        compressed.Seek(0, SeekOrigin.Begin);
                        compressed.Read(compressedArray, 0, (int)compressed.Length);

                        Write4(s, 0x00000100);
                        Write4(s, (uint)(compressed.Length + 4));
                        Write4(s, Swap4((uint)blockSize));
                        WriteArray(s, compressedArray);

                        if ((compressed.Length % 4) != 0)
                        {
                            s.Seek(4 - (compressed.Length % 4), SeekOrigin.Current);
                        }

                        index   += 0x00100000;
                        reaming -= 0x00100000;
                    } while (index < Data.Length);
                }

                Write4(s, 0x00000101);
                Write4(s, 0x00000000);
            }
            else
            {
                WriteArray(s, Data);
            }

            tempOffset = s.Position;
            uint size = (uint)(tempOffset - sizeOffset - 4);

            s.Seek(sizeOffset, SeekOrigin.Begin);
            Write4(s, size);
            s.Seek(tempOffset, SeekOrigin.Begin);
        }