Example #1
0
        private void GenerarCodigosPrefijo()
        {
            //Se agrega al diccionario<byte, string>, la key de tipo byte sirve para cuando va leyendo el texto
            //y si la encuentra en el diccionario agrega el value que es un string que va a tener el código prefijo
            foreach (var objetoCaracter in ListadoCaracteres)
            {
                if (!DiccionarioPrefijos.ContainsKey(objetoCaracter.Caracter))
                {
                    DiccionarioPrefijos.Add(objetoCaracter.Caracter, "");
                }
            }

            //Se va construyendo el "árbol" según las proobabilidades de ocurrencia de los caracteres
            while (ListadoCaracteres.Count != 1)
            {
                var nodoIzq = ListadoCaracteres[0];
                ListadoCaracteres[0] = null;
                ListadoCaracteres.RemoveAt(0);
                nodoIzq.Codigo += "0";

                var nodoDrch = ListadoCaracteres[0];
                ListadoCaracteres[0] = null;
                ListadoCaracteres.RemoveAt(0);
                nodoDrch.Codigo += "1";

                var nodoPadre = new ObjectCaracter(' ', 0, true);

                nodoPadre.Drch = nodoDrch;
                nodoPadre.Izq  = nodoIzq;

                nodoPadre.Probabilidad = nodoPadre.Drch.Probabilidad + nodoPadre.Izq.Probabilidad;

                ListadoCaracteres.Add(nodoPadre);
                ListadoCaracteres.Sort(ObjectCaracter.OrdenarPorProbabilidad);
            }

            var CodigoPrefijo = "";

            RecorrerArbol(ListadoCaracteres[0], CodigoPrefijo);
            ListadoCaracteres.RemoveAt(0);

            BufferLectura = new byte[largoBuffer];
        }
Example #2
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);
        }
Example #3
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);
        }