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