コード例 #1
0
        public ActionResult GeneraciónDelArchivoOriginal()
        {
            string       binario = string.Empty;
            string       texto   = string.Empty;
            CantidadChar valor   = new CantidadChar();

            foreach (byte bit in ASCII)
            {
                binario = string.Empty;
                binario = binario + Convertir(bit, binario);
                foreach (char car in binario)
                {
                    valor.codPref = valor.codPref + car;
                    foreach (char Key in diccionario.Keys)
                    {
                        CantidadChar valor2 = GetAnyValue <CantidadChar>(Convert.ToByte(Key));
                        if (valor.codPref == valor2.codPref)
                        {
                            texto         = texto + Key;
                            valor.codPref = string.Empty;
                        }
                    }
                }
            }
            using (var writeStream = new FileStream(RutaArchivos + "\\..\\Files\\archivoDescomprimido.huff", FileMode.OpenOrCreate))
            {
                using (var writer = new BinaryWriter(writeStream))
                {
                    int    cantidadvecesbuffer = 0;
                    byte[] byteBufferfinal     = new byte[100];
                    int    cantidad            = 0;
                    foreach (char carfinal in texto)
                    {
                        byteBufferfinal[cantidad] = Convert.ToByte(carfinal);
                        cantidad++;
                        if (cantidad == 100)
                        {
                            if (cantidadvecesbuffer == 0)
                            {
                                writer.Write(byteBufferfinal);
                                byteBufferfinal = new byte[100];
                                cantidadvecesbuffer++;
                                cantidad = 0;
                            }
                            else
                            {
                                writer.Seek(0, SeekOrigin.End);
                                writer.Write(byteBufferfinal);
                                byteBufferfinal = new byte[100];
                                cantidad        = 0;
                            }
                        }
                    }
                    if ((byteBufferfinal[0] == 0) && (byteBufferfinal[1] == 0))
                    {
                        // nada porque se aseguró que el buffer esté vacío
                    }
                    else
                    {
                        int         contador0 = 0;
                        List <byte> ListAux   = new List <byte>();
                        foreach (byte bit in byteBufferfinal)
                        {
                            if (bit == 0)
                            {
                                contador0++;
                            }
                            else
                            {
                                contador0 = 0;
                            }
                            if (contador0 != 3)
                            {
                                ListAux.Add(bit);
                            }
                            else
                            {
                                for (int i = 0; i < 2; i++)
                                {
                                    ListAux.Remove(ListAux.Last());
                                }
                                break;
                            }
                        }
                        byteBufferfinal = new byte[ListAux.Count()];
                        int j = 0;
                        foreach (byte bite in ListAux)
                        {
                            byteBufferfinal[j] = bite;
                            j++;
                        }
                        writer.Seek(0, SeekOrigin.End);
                        writer.Write(byteBufferfinal);
                    }
                }
            }
            return(RedirectToAction("RazonFactor"));
        }
コード例 #2
0
        //Al momento de haber recibido el string del texto, habrá que separar caracter por caracter
        public ActionResult Arbol()
        {
            //creación del árbol
            Huffman HuffmanProcess = new Huffman();
            Arbol   Arbol          = new Arbol();

            Arbol.raíz = HuffmanProcess.TreeCreation(lista);
            string prefíjo = string.Empty;

            diccionario = Arbol.códigosPrefíjo(Arbol.raíz, diccionario, prefíjo);
            //Escritura del compresor códigos prefíjos convertidos a bytes
            using (var writeStream = new FileStream(RutaArchivos + "\\..\\Files\\archivoComprimido.huff", FileMode.Open))
            {
                using (var writer = new BinaryWriter(writeStream))
                {
                    byte[]      bytebuffer     = new byte[500];
                    List <char> cadena         = new List <char>();
                    int         cantidadbuffer = 0;
                    foreach (byte bit in ListaByte)
                    {
                        CantidadChar separación = new CantidadChar();
                        separación = GetAnyValue <int>(bit);
                        foreach (char caracter in separación.codPref)
                        {
                            cadena.Add(caracter);
                        }
                    }
                    string binario = "";
                    foreach (char car in cadena)
                    {
                        if (binario.Count() == 8)
                        {
                            byte    DECABYTE = new byte();
                            var     pref     = binario;
                            decimal x        = Convert.ToInt32(pref, 2);
                            DECABYTE = Convert.ToByte(x);
                            bytebuffer[cantidadbuffer] = DECABYTE;
                            cantidadbuffer++;
                            binario = string.Empty;
                            binario = binario + car;
                        }
                        else
                        {
                            binario = binario + car;
                        }
                        if (cantidadbuffer == 500)
                        {
                            writer.Seek(0, SeekOrigin.End);
                            writer.Write(bytebuffer);
                            cantidadbuffer = 0;
                            bytebuffer     = new byte[500];
                        }
                    }
                    if (binario != string.Empty)
                    {
                        while (binario.Count() != 8)
                        {
                            binario = binario + "0";
                        }
                        byte    DECABYTE = new byte();
                        var     pref     = binario;
                        decimal x        = Convert.ToInt32(pref, 2);
                        DECABYTE = Convert.ToByte(x);
                        bytebuffer[cantidadbuffer] = DECABYTE;
                        int         contador0 = 0;
                        List <byte> ListAux   = new List <byte>();
                        foreach (byte bit in bytebuffer)
                        {
                            if (bit == 0)
                            {
                                contador0++;
                            }
                            else
                            {
                                contador0 = 0;
                            }
                            if (contador0 != 10)
                            {
                                ListAux.Add(bit);
                            }
                            else
                            {
                                for (int i = 0; i < 9; i++)
                                {
                                    ListAux.Remove(ListAux.Last());
                                }
                                break;
                            }
                        }
                        bytebuffer = new byte[ListAux.Count()];
                        int j = 0;
                        foreach (byte bit in ListAux)
                        {
                            bytebuffer[j] = bit;
                            j++;
                        }
                        writer.Seek(0, SeekOrigin.End);
                        writer.Write(bytebuffer);
                    }
                }
            }
            return(RedirectToAction("Download"));
        }
コード例 #3
0
 public ActionResult LecturaDescompresión(HttpPostedFileBase postedFile)
 {
     diccionario = new Dictionary <char, CantidadChar>();
     using (var stream = new FileStream(RutaArchivos + "\\..\\Files\\archivoComprimido.huff", FileMode.Open))
     {
         using (var reader = new BinaryReader(stream))
         {
             string prefijos   = string.Empty;
             char   caracter   = ' ';
             byte[] byteBuffer = new byte[bufferLengt];
             bool   encontrado = false;
             bool   separador  = false;
             while (reader.BaseStream.Position != reader.BaseStream.Length)
             {
                 byteBuffer = reader.ReadBytes(bufferLengt);
                 for (int i = 0; i < byteBuffer.Count(); i++)
                 {
                     if (separador != true)
                     {
                         if ((byteBuffer[i] == 45))
                         {
                             if ((byteBuffer[i + 1] == 45))
                             {
                                 separador = true;
                                 i         = i + 2;
                             }
                         }
                         if (encontrado == false)
                         {
                             if (byteBuffer[i] == 124)
                             {
                                 caracter   = (char)byteBuffer[i - 1];
                                 encontrado = true;
                             }
                         }
                         else
                         {
                             if ((byteBuffer[i + 1] != 124) && (byteBuffer[i] != 2))
                             {
                                 prefijos += (char)byteBuffer[i];
                             }
                             else
                             {
                                 CantidadChar prefijo = new CantidadChar();
                                 prefijo.codPref = prefijos;
                                 if (prefijo.codPref[0] == '|')
                                 {
                                     string prueba = string.Empty;
                                     for (int j = 1; j < prefijo.codPref.Count(); j++)
                                     {
                                         prueba = prueba + prefijo.codPref[j];
                                     }
                                     prefijo.codPref = prueba;
                                 }
                                 diccionario.Add(caracter, prefijo);
                                 encontrado = false;
                                 prefijos   = "";
                             }
                         }
                     }
                     else
                     {
                         ASCII.Add(byteBuffer[i]);
                     }
                 }
             }
         }
     }
     for (int i = 0; i < 2; i++)
     {
         ASCII.Remove(ASCII[0]);
     }
     return(RedirectToAction("GeneraciónDelArchivoOriginal"));
 }