/// <summary>
        /// Comprueba si el stream esta en formato ZLib
        /// </summary>
        /// <param name="stream">Stream a comprobar</param>
        /// <returns>Retorna True en caso de que el stream sea en formato ZLib y False en caso contrario u error</returns>
        public static bool IsZLibStream(Stream stream)
        {
            bool       bResult = false;
            int        CMF     = 0;
            int        Flag    = 0;
            ZLibHeader header;

            //Comprobamos si la secuencia esta en la posición 0, de no ser así, lanzamos una excepción
            if (stream.Position != 0)
            {
                throw new ArgumentOutOfRangeException("Sequence must be at position 0");
            }

            //Comprobamos si podemos realizar la lectura de los dos bytes que conforman la cabecera
            if (stream.CanRead == true)
            {
                CMF  = stream.ReadByte();
                Flag = stream.ReadByte();
                try
                {
                    header  = ZLibHeader.DecodeHeader(CMF, Flag);
                    bResult = header.IsSupportedZLibStream;
                }
                catch
                {
                    //Nada
                }
            }

            return(bResult);
        }
Exemple #2
0
        public static ZLibHeader DecodeHeader(int pCMF, int pFlag)
        {
            ZLibHeader result = new ZLibHeader();

            //Ensure that parameters are bytes
            pCMF  = pCMF & 0x0FF;
            pFlag = pFlag & 0x0FF;

            //Decode bytes
            result.CompressionInfo   = Convert.ToByte((pCMF & 0xF0) >> 4);
            result.CompressionMethod = Convert.ToByte(pCMF & 0x0F);

            result.FCheck = Convert.ToByte(pFlag & 0x1F);
            result.FDict  = Convert.ToBoolean(Convert.ToByte((pFlag & 0x20) >> 5));
            result.FLevel = (FLevel)Convert.ToByte((pFlag & 0xC0) >> 6);

            result.IsSupportedZLibStream = (result.CompressionMethod == 8) && (result.CompressionInfo == 7) && (((pCMF * 256 + pFlag) % 31 == 0)) && (result.FDict == false);

            return(result);
        }
        /// <summary>
        /// Inicializa el encabezado del stream en formato ZLib
        /// </summary>
        private void InicializarZLibHeader()
        {
            byte[] bytesHeader;

            //Establecemos la configuración de la cabecera
            ZLibHeader header = new ZLibHeader();

            header.CompressionMethod = 8; //Deflate
            header.CompressionInfo   = 7;

            header.FDict = false; //Sin diccionario
            switch (this.mCompressionLevel)
            {
            case CompressionLevel.NoCompression:
            {
                header.FLevel = FLevel.Faster;
                break;
            }

            case CompressionLevel.Fastest:
            {
                header.FLevel = FLevel.Default;
                break;
            }

            case CompressionLevel.Optimal:
            {
                header.FLevel = FLevel.Optimal;
                break;
            }
            }

            bytesHeader = header.EncodeZlibHeader();

            this.mRawStream.WriteByte(bytesHeader[0]);
            this.mRawStream.WriteByte(bytesHeader[1]);
        }