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