NodeComponents NodeAssembler(NodeComponents lowNode, NodeComponents maxNode) { var father = new NodeComponents(); var infoNewFather = new initialReadComponents(); father.CharacterData = infoNewFather; father.LeftSon = lowNode; father.RigthSon = maxNode; father.CharacterData.probabilidad = lowNode.CharacterData.probabilidad + maxNode.CharacterData.probabilidad; return(father); }
void PrefixCodeAssignment(NodeComponents actualNode, string prefixCode) { if (actualNode.RigthSon != null && actualNode.LeftSon != null) { PrefixCodeAssignment(actualNode.LeftSon, prefixCode + "0"); PrefixCodeAssignment(actualNode.RigthSon, prefixCode + "1"); } else { actualNode.CharacterData.codigoPrefijo = prefixCode; prefixDictionary.Add(actualNode.CharacterData.caracter, actualNode.CharacterData.codigoPrefijo); } }
public string ComprimirArchivo(List <initialReadComponents> listaDeCaracteres, Stream archivo, string nombreArchivo, int buffLength) { listaDeCaracteres.Sort((comp1, comp2) => comp1.probabilidad.CompareTo(comp2.probabilidad)); var nodosParaHuffman = new List <NodeComponents>(); for (int i = 0; i < listaDeCaracteres.Count; i++) { var nodoTransicion = new NodeComponents(); nodoTransicion.CharacterData = listaDeCaracteres[i]; nodosParaHuffman.Add(nodoTransicion); } HuffmanAlgorithm.HuffmanAssembler(nodosParaHuffman); HuffmanAlgorithm.fillPrefixDictionary(); var bufferLength = Convert.ToInt64(archivo.Length); var path = Path.Combine(HttpContext.Current.Server.MapPath("~/UploadedFiles"), nombreArchivo); var textoResultadoCompresion = string.Empty; textoResultadoCompresion += (nombreArchivo + "|"); using (var reader = new BinaryReader(archivo)) { using (var writeStream = new FileStream(path, FileMode.OpenOrCreate)) { var byteBuffer = new byte[bufferLength]; //meto el diccionario de prefijos al buffer y lo escribo foreach (var item in HuffmanAlgorithm.GetDictionary()) { textoResultadoCompresion += ($"{item.Key}|{item.Value}|"); } textoResultadoCompresion += "|"; int cantBitsOriginales = 0; while (reader.BaseStream.Position != reader.BaseStream.Length) { var myIntValue = unchecked ((int)bufferLength); int tamañoBufferNuevo = 0; byteBuffer = HuffmanAlgorithm.compressBuffer(reader.ReadBytes(myIntValue), myIntValue, ref tamañoBufferNuevo, ref cantBitsOriginales); tamañoBufferNuevo++; textoResultadoCompresion += ($"|{cantBitsOriginales}|"); textoResultadoCompresion += Encoding.Default.GetString(byteBuffer); } } } return(textoResultadoCompresion); }
public void HuffmanAssembler(List <NodeComponents> charactersList) { while (charactersList.Count > 1) { var newNode = new NodeComponents(); newNode = NodeAssembler(charactersList[0], charactersList[1]); charactersList.RemoveAt(0); charactersList.RemoveAt(0); var newPossitionHuffmanNode = charactersList.FindIndex(x => x.CharacterData.probabilidad >= newNode.CharacterData.probabilidad); if (newPossitionHuffmanNode == -1) { charactersList.Add(newNode); } else { charactersList.Insert(newPossitionHuffmanNode, newNode); } } root = charactersList[0]; charactersList.Clear(); charactersList = null; }