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);
     }
 }
Example #3
0
        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;
        }