public void ConcatenandoCodigoPrefijo(Estructuras.Nodo nodo) { if (nodo.recorridoIzq == true) { codigo = $"0{codigo}"; ConcatenandoCodigoPrefijo(nodo.padre); } else if (nodo.recorridoDer == true) { codigo = $"1{codigo}"; ConcatenandoCodigoPrefijo(nodo.padre); } }
public void ObteniendoCodigoPrefijo(Estructuras.Nodo nodo) { if (nodo != null) { ObteniendoCodigoPrefijo(nodo.izq); if (nodo.Valor != 'N') { ConcatenandoCodigoPrefijo(nodo); var val = (byte)nodo.Valor; CodigosPrefijoArchivoActual.Add(val, codigo); codigo = ""; } else if (nodo.Valor == 'N' && nodo.izq == null && nodo.der == null) { ConcatenandoCodigoPrefijo(nodo); CodigosPrefijoArchivoActual.Add(nodo.Valor, codigo); codigo = ""; } ObteniendoCodigoPrefijo(nodo.der); } }
public int CompresiónHuffman(string path, string[] nombreArchivo, string pathHuffman) { var ListaNodos = new List <Estructuras.Nodo>(); var Frecuencias = new Dictionary <byte, int>(); using (var stream = new FileStream(path, FileMode.Open)) { using (var reader = new BinaryReader(stream)) { var byteBuffer = new byte[bufferLength]; while (reader.BaseStream.Position != reader.BaseStream.Length) { byteBuffer = reader.ReadBytes(bufferLength); for (int i = 0; i < byteBuffer.Length; i++) { if (Frecuencias.ContainsKey(byteBuffer[i]) == false) { Frecuencias.Add(byteBuffer[i], 1); } else { Frecuencias[byteBuffer[i]] = Frecuencias[byteBuffer[i]] + 1; } } } foreach (var nodos in Frecuencias) { Estructuras.Nodo nodo = new Estructuras.Nodo(); nodo.Frecuencia = nodos.Value; nodo.Valor = nodos.Key; ListaNodos.Add(nodo); } ListaNodos.Sort((x, y) => x.CompareTo(y)); } } while (ListaNodos.Count >= 2) { Estructuras.Nodo padre = new Estructuras.Nodo(); ListaNodos[0].recorridoIzq = true; ListaNodos[1].recorridoDer = true; padre.izq = ListaNodos[0]; padre.der = ListaNodos[1]; padre.Frecuencia = padre.izq.Frecuencia + padre.der.Frecuencia; ListaNodos[0].padre = padre; ListaNodos[1].padre = padre; var cont = 0; var agregado = false; foreach (var item in ListaNodos) { cont++; if (padre.Frecuencia <= item.Frecuencia) { ListaNodos.Insert(cont - 1, padre); agregado = true; break; } } if (agregado == false) { ListaNodos.Add(padre); } ListaNodos.Remove(ListaNodos[0]); ListaNodos.Remove(ListaNodos[0]); } Estructuras.ArbolS tree = new Estructuras.ArbolS(); tree.raiz = ListaNodos[0]; ListaNodos.Clear(); ObteniendoCodigoPrefijo(tree.raiz); CodigosPrefijo.Add(nombreArchivo[0], CodigosPrefijoArchivoActual); using (var stream = new FileStream(path, FileMode.Open)) { using (var reader = new BinaryReader(stream)) { using (var writeStream = new FileStream($"{pathHuffman}/{nombreArchivo[0]}.huff", FileMode.OpenOrCreate)) { using (var writer = new BinaryWriter(writeStream)) { var DiccionarioActual = CodigosPrefijo[nombreArchivo[0]]; writer.Write(nombreArchivo[1]); foreach (var codigo in DiccionarioActual) { writer.Write($"{codigo.Key}|{codigo.Value}|"); } writer.Write("--"); var byteBuffer = new byte[bufferLength]; var PosibleLlave = string.Empty; while (reader.BaseStream.Position != reader.BaseStream.Length) { byteBuffer = reader.ReadBytes(bufferLength); for (int i = 0; i < byteBuffer.Length; i++) { PosibleLlave = $"{PosibleLlave}{DiccionarioActual[byteBuffer[i]]}"; while (PosibleLlave.Length > 8) { var decimaln = Convert.ToInt32(PosibleLlave.Substring(0, 8), 2); var Caracter = Convert.ToByte(decimaln); writer.Write(Caracter); PosibleLlave = PosibleLlave.Substring(8); } } } } } } } CodigosPrefijoArchivoActual.Clear(); return(1); }