/// <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) { var 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 var header = new ZlibHeader { CompressionMethod = 8, //Deflate CompressionInfo = 7, 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]); }