예제 #1
0
        private void generarcodigo()
        {
            foreach (var caracteres in listacaracteres)
            {
                if (!dicprefijos.ContainsKey(caracteres.caracter))
                {
                    dicprefijos.Add(caracteres.caracter, "");
                }
            }
            while (listacaracteres.Count != 1)
            {
                var nodoizq = listacaracteres[0];
                listacaracteres[0] = null;
                listacaracteres.RemoveAt(0);
                nodoizq.Codigo += "0";

                var nododer = listacaracteres[0];
                listacaracteres[0] = null;
                listacaracteres.RemoveAt(0);
                nododer.Codigo += "1";

                var nodopadre = new Caracteres(' ', 0, true);
                nodopadre.derecha      = nododer;
                nodopadre.izquierda    = nodoizq;
                nodopadre.Probabilidad = nodopadre.derecha.Probabilidad + nodopadre.izquierda.Probabilidad;
                listacaracteres.Add(nodopadre);
                listacaracteres.Sort(Caracteres.ordenarporprobabilidad);
            }
            var codigoprefijo = "";

            recorrido(listacaracteres[0], codigoprefijo);
            listacaracteres.RemoveAt(0);
            Bufferlectura = new byte[largobuffer];
        }
예제 #2
0
 private void recorrido(Caracteres nodo, string prefijos)
 {
     if (nodo != null)
     {
         if (nodo.Codigo != "")
         {
             prefijos += nodo.Codigo;
             if (nodo.padre == false)
             {
                 dicprefijos[nodo.caracter] = prefijos;
                 prefijos = "";
             }
             recorrido(nodo.izquierda, prefijos);
             recorrido(nodo.derecha, prefijos);
         }
         else
         {
             recorrido(nodo.izquierda, prefijos);
             recorrido(nodo.derecha, prefijos);
         }
     }
 }
예제 #3
0
        //Compresión
        private void Obtenertablaapariciones()
        {
            using (var file = new FileStream(rutaabsarchivooriginal, FileMode.Open, FileAccess.Read))
            {
                using (var reader = new BinaryReader(file))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        Bufferlectura = reader.ReadBytes(largobuffer);
                        var chars = Encoding.UTF8.GetChars(Bufferlectura);

                        foreach (var caracter in chars)
                        {
                            Predicate <Caracteres> buscadorcaracteres = delegate(Caracteres caracteres)
                            {
                                return(caracteres.caracter == caracter);
                            };

                            if (listacaracteres.Find(buscadorcaracteres) == null)
                            {
                                var caracteres = new Caracteres(caracter, 0, false);
                                caracteres.CantidaRepetido++;
                                listacaracteres.Add(caracteres);
                            }
                            else
                            {
                                listacaracteres.Find(buscadorcaracteres).CantidaRepetido++;
                            }
                            cantidadcaracteres++;
                        }
                    }
                }
            }
            foreach (var caracteres in listacaracteres)
            {
                caracteres.CalcularProbabilidad(cantidadcaracteres);
            }
            listacaracteres.Sort(Caracteres.ordenarporprobabilidad);

            foreach (var caracteres in listacaracteres)
            {
                dicapariciones.Add(caracteres.caracter, caracteres.CantidaRepetido);
            }

            var linea = "";

            foreach (var caracter in dicapariciones)
            {
                if (caracter.Key == '\n')
                {
                    linea += "/n" + caracter.Value + "|";
                }
                else if (caracter.Key == '\t')
                {
                    linea += "/t" + caracter.Value + "|";
                }
                else if (caracter.Key == '\r')
                {
                    linea += "/r" + caracter.Value + "|";
                }
                else if (caracter.Key == ' ')
                {
                    linea += "esp" + caracter.Value + "|";
                }
                else
                {
                    linea += caracter.Key + " " + caracter.Value + "|";
                }
            }
            linea  = linea.Remove(linea.Length - 1);
            linea += Environment.NewLine;

            var buffertabla = Encoding.UTF8.GetBytes(linea);
            var tabla       = Encoding.UTF8.GetChars(buffertabla);

            using (var file = new FileStream(rutaabsserver + nombrearchivooperado, FileMode.Create))
            {
                using (var writer = new BinaryWriter(file))
                {
                    writer.Write(tabla);
                }
            }
        }
예제 #4
0
        //Descompresion
        private int Tabla()
        {
            Bufferlectura = new byte[largobuffer];
            var leerhasta  = 0;
            var lineatabla = "";

            using (var file = new FileStream(rutaabsarchivooriginal, FileMode.Open))
            {
                using (var reader = new BinaryReader(file))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        Bufferlectura = reader.ReadBytes(largobuffer);
                        for (int i = 0; i < Bufferlectura.Length; i++)
                        {
                            leerhasta++;
                            if (Bufferlectura[i] == 13)
                            {
                                reader.BaseStream.Position = reader.BaseStream.Length;
                                i = largobuffer;
                            }
                        }
                    }
                    reader.BaseStream.Position = 0;
                    lineatabla = Encoding.UTF8.GetString(reader.ReadBytes(leerhasta - 1));
                }
            }
            var items = lineatabla.Split('|');

            foreach (var caracteres in items)
            {
                char caracter = ' ';
                if (caracteres != "" && caracteres != " ")
                {
                    var repeticion = int.Parse(caracteres.Split(' ')[1]);
                    if (caracteres.Split(' ')[0] == "/r")
                    {
                        caracter = '\r';
                    }
                    else if (caracteres.Split(' ')[0] == "esp")
                    {
                        caracter = ' ';
                    }
                    else if (caracteres.Split(' ')[0] == "/t")
                    {
                        caracter = '\t';
                    }
                    else if (caracteres.Split(' ')[0] == "/n")
                    {
                        caracter = '\n';
                    }
                    else
                    {
                        caracter = Convert.ToChar(caracteres.Split(' ')[0]);
                    }
                    cantidadcaracteres += repeticion;
                    var _caracteres = new Caracteres(caracter, repeticion, false);
                    listacaracteres.Add(_caracteres);
                }
            }
            foreach (var caracteres in listacaracteres)
            {
                caracteres.CalcularProbabilidad(cantidadcaracteres);
            }
            return(leerhasta);
        }