/// <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); }
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]); }