Beispiel #1
0
        public void Descomprimir()
        {
            NombreArchivoOperado = NombreArchivoOriginal.Split('.')[0] + ".txt";

            var leerDesde = ObtenerTabla() + 1;

            GenerarCodigosPrefijo();

            BufferLectura = new byte[largoBuffer];

            var lineaEnBits      = "";
            var lineaAuxBits     = "";
            var bitsCaracter     = "";
            var borrarPosiciones = 0;
            var escribirEn       = 0;

            using (var file = new FileStream(RutaAbsolutaArchivoOriginal, FileMode.Open))
            {
                using (var reader = new BinaryReader(file, Encoding.UTF8))
                {
                    reader.BaseStream.Position = leerDesde;

                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        BufferLectura = reader.ReadBytes(largoBuffer);

                        foreach (var caracter in BufferLectura)
                        {
                            var binario = Convert.ToString(caracter, 2); //Se convierte a binario el número de byte del caracter
                            lineaEnBits += binario.PadLeft(8, '0');      //Se rellena si el binario no tiene 8 bits
                        }

                        var continuar = false;
                        bitsCaracter = "";

                        while (lineaEnBits.Length > 0 && continuar == false)
                        {
                            lineaAuxBits = lineaEnBits;

                            while (!DiccionarioPrefijos.ContainsValue(bitsCaracter) && lineaAuxBits != "")
                            {
                                bitsCaracter += lineaAuxBits.Substring(0, 1);
                                lineaAuxBits  = lineaAuxBits.Remove(0, 1);
                                borrarPosiciones++;

                                if (lineaAuxBits == "" && !DiccionarioPrefijos.ContainsValue(bitsCaracter))
                                {
                                    borrarPosiciones = 0;
                                    continuar        = true;
                                }
                            }

                            lineaEnBits      = lineaEnBits.Remove(0, borrarPosiciones);
                            borrarPosiciones = 0;

                            char key = '\0';

                            foreach (var item in DiccionarioPrefijos)
                            {
                                if (item.Value == bitsCaracter)
                                {
                                    key = item.Key;
                                }
                            }

                            if (escribirEn < largoBuffer)
                            {
                                if (key != '\0')
                                {
                                    BufferEscrituraDescompresion[escribirEn] = key;
                                    bitsCaracter = "";
                                    escribirEn++;
                                }
                            }
                            else
                            {
                                if (key != '\0')
                                {
                                    EscribirDecompresion(escribirEn);
                                    escribirEn = 0;
                                    BufferEscrituraDescompresion[escribirEn] = key;
                                    bitsCaracter = "";
                                    escribirEn++;
                                }
                            }
                        }

                        EscribirDecompresion(escribirEn);
                        escribirEn = 0;
                    }
                }
            }
            File.Delete(RutaAbsolutaArchivoOriginal);
        }
Beispiel #2
0
        public void Comprimir()
        {
            NombreArchivoOperado = NombreArchivoOriginal.Split('.')[0] + ".huff";

            ObtenerTablaAparicionesProbabilidades();
            GenerarCodigosPrefijo();

            BufferLectura = new byte[largoBuffer];

            var lineaEnPrefijos = "";
            var escribirEn      = 0;

            using (var file = new FileStream(RutaAbsolutaArchivoOriginal, FileMode.Open))
            {
                using (var reader = new BinaryReader(file, Encoding.UTF8))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        BufferLectura = reader.ReadBytes(largoBuffer);
                        var chars = Encoding.UTF8.GetChars(BufferLectura);

                        //caracterBytes significa que adentro del buffer en cada casilla hay un byte que es el caracter leído
                        foreach (var caracter in chars) //cambiado
                        {
                            if (DiccionarioPrefijos.ContainsKey(caracter))
                            {
                                lineaEnPrefijos += DiccionarioPrefijos[caracter];
                            }
                            else
                            {
                                throw new Exception("No se ha encontrado el caracter leído en la tabla de aparaciciones");
                            }
                        }

                        while (lineaEnPrefijos.Length >= 8)
                        {
                            var ochoBits = lineaEnPrefijos.Substring(0, 8); //Obtiene los primeros 8 bits de la línea

                            lineaEnPrefijos = lineaEnPrefijos.Remove(0, 8); //Elimina los 8 obtenidos anteriormente

                            BufferEscritura[escribirEn] = (byte)Convert.ToInt32(ochoBits, 2);
                            escribirEn++;
                        }

                        if (reader.BaseStream.Position == reader.BaseStream.Length) //Si ya leyó lo último del archivo y todavía hay bits, se rellena a la derecha, no a la izquierda
                        {
                            if (lineaEnPrefijos.Length > 0)
                            {
                                lineaEnPrefijos             = lineaEnPrefijos.PadRight(8, '0');
                                BufferEscritura[escribirEn] = (byte)Convert.ToInt32(lineaEnPrefijos, 2);
                                escribirEn++;
                            }
                        }

                        Escribir(escribirEn);
                        escribirEn = 0;
                    }
                }
            }
            File.Delete(RutaAbsolutaArchivoOriginal);
        }