public void CompresionLZWImportar(FileStream ArchivoImportado) { Dictionary <string, int> LZWdiccionario = new Dictionary <string, int>(); var extension = Path.GetExtension(ArchivoImportado.Name); var nombre = Path.GetFileName(ArchivoImportado.Name).Replace("EXPORTADO_", ""); var PropiedadesArchivoActual = new MiArchivo(); FileInfo ArchivoAnalizado = new FileInfo(ArchivoImportado.Name); PropiedadesArchivoActual.TamanoArchivoDescomprimido = ArchivoAnalizado.Length; PropiedadesArchivoActual.NombreArchivoOriginal = ArchivoAnalizado.Name; nombreArchivo = ArchivoAnalizado.Name.Split('.')[0]; var listaCaracteresExistentes = new List <byte>(); var listaCaracteresBinario = new List <string>(); var ASCIIescribir = new List <int>(); using (var Lectura = new BinaryReader(ArchivoImportado)) { using (FileStream writeStream = new FileStream((@"TusArchivos/IMPORTADO_" + nombreArchivo + ".lzw"), FileMode.OpenOrCreate)) { using (BinaryWriter writer = new BinaryWriter(writeStream)) { var byteBuffer = new byte[bufferLength]; while (Lectura.BaseStream.Position != Lectura.BaseStream.Length) { byteBuffer = Lectura.ReadBytes(bufferLength); foreach (var item in byteBuffer) { if (!listaCaracteresExistentes.Contains(item)) { listaCaracteresExistentes.Add(item); } } } listaCaracteresExistentes.Sort(); foreach (var item in listaCaracteresExistentes) { var caractreres = Convert.ToChar(item); LZWdiccionario.Add(caractreres.ToString(), LZWdiccionario.Count + 1); } var diccionarioTam = Convert.ToString(LZWdiccionario.LongCount()) + "."; writer.Write(diccionarioTam.ToCharArray()); Lectura.BaseStream.Position = 0; var thisCaracter = string.Empty; var myOutput = string.Empty; while (Lectura.BaseStream.Position != Lectura.BaseStream.Length) { byteBuffer = Lectura.ReadBytes(bufferLength); foreach (byte item in byteBuffer) { var toAnalizar = thisCaracter + Convert.ToChar(item); if (LZWdiccionario.ContainsKey(toAnalizar)) { thisCaracter = toAnalizar; } else { ASCIIescribir.Add(LZWdiccionario[thisCaracter]); LZWdiccionario.Add(toAnalizar, LZWdiccionario.Count + 1); thisCaracter = Convert.ToChar(item).ToString(); } } } ASCIIescribir.Add(LZWdiccionario[thisCaracter]); var textotamano = Convert.ToString(LZWdiccionario.LongCount()) + "."; writer.Write(textotamano.ToCharArray()); foreach (var item in listaCaracteresExistentes) { var Indice = Convert.ToByte(item); writer.Write(Indice); } writer.Write(Environment.NewLine); var mayorIndice = ASCIIescribir.Max(); var bitsIndiceMayor = (Convert.ToString(mayorIndice, 2)).Count(); writer.Write(bitsIndiceMayor.ToString().ToCharArray()); writer.Write(extension.ToCharArray()); writer.Write(Environment.NewLine); if (mayorIndice > 255) { foreach (var item in ASCIIescribir) { var indiceBinario = Convert.ToString(item, 2); while (indiceBinario.Count() < bitsIndiceMayor) { indiceBinario = "0" + indiceBinario; } listaCaracteresBinario.Add(indiceBinario); } var allBits = string.Empty; foreach (var item in listaCaracteresBinario) { for (int i = 0; i < item.Length; i++) { if (allBits.Count() < 8) { allBits += item[i]; } else { var allDecimal = Convert.ToInt64(allBits, 2); var allBytes = Convert.ToByte(allDecimal); writer.Write((allBytes)); allBits = string.Empty; allBits += item[i]; } } } if (allBits.Length > 0) { var allResultado = Convert.ToInt64(allBits, 2); writer.Write(Convert.ToByte(allResultado)); } } else { foreach (var item in ASCIIescribir) { writer.Write(Convert.ToByte(Convert.ToInt32(item))); } } PropiedadesArchivoActual.TamanoArchivoComprimido = writeStream.Length; PropiedadesArchivoActual.FactorCompresion = Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoComprimido) / Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoDescomprimido); PropiedadesArchivoActual.RazonCompresion = Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoDescomprimido) / Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoComprimido); PropiedadesArchivoActual.PorcentajeReduccion = (Convert.ToDouble(1) - PropiedadesArchivoActual.FactorCompresion).ToString(); PropiedadesArchivoActual.FormatoCompresion = ".lzw"; Factor FactorCompresion = new Factor(); FactorCompresion.GuaradarCompresiones(PropiedadesArchivoActual, "LZW"); } } } }
public void CompresionHuffmanImportar(FileStream ArchivoImportado) { string nombreArchivo = Path.GetFileNameWithoutExtension(ArchivoImportado.Name); var huffman = new Huffman(); var PropiedadesArchivoActual = new MiArchivo(); PropiedadesArchivoActual.TamanoArchivoDescomprimido = ArchivoImportado.Length; PropiedadesArchivoActual.NombreArchivoOriginal = ArchivoImportado.Name; ArchivoImportado.Close(); var direccion = Path.GetFullPath(ArchivoImportado.Name); int cantidadCaracteres = huffman.Leer(direccion); huffman.CrearArbol(); byte[] encabezado = huffman.CrearEncabezado(cantidadCaracteres); using (FileStream archivo = new FileStream("TusArchivos/IMPORTADO_" + nombreArchivo + ".huff", FileMode.OpenOrCreate, FileAccess.ReadWrite)) { foreach (var item in encabezado) { archivo.WriteByte(item); } int bufferLength = 80; var buffer = new byte[bufferLength]; string textoCifrado = string.Empty; using (var file = new FileStream(ArchivoImportado.Name, FileMode.Open)) { using (var reader = new BinaryReader(file)) { while (reader.BaseStream.Position != reader.BaseStream.Length) { buffer = reader.ReadBytes(bufferLength); foreach (var item in buffer) { int posiList; posiList = Datos.Instance.ListaCod.FindIndex(x => x.caracter == item); textoCifrado = textoCifrado + Datos.Instance.ListaCod.ElementAt(posiList).codigo; if ((textoCifrado.Length / 8) > 0) { string escribirByte = textoCifrado.Substring(0, 8); byte byteEscribir = Convert.ToByte(escribirByte, 2); archivo.WriteByte(byteEscribir); textoCifrado = textoCifrado.Substring(8); } } } reader.ReadBytes(bufferLength); } } if (textoCifrado.Length > 0 && (textoCifrado.Length % 8) == 0) { byte byteEsc = Convert.ToByte(textoCifrado, 2); } else if (textoCifrado.Length > 0) { textoCifrado = textoCifrado.PadRight(8, '0'); byte byteEsc = Convert.ToByte(textoCifrado, 2); } PropiedadesArchivoActual.TamanoArchivoComprimido = archivo.Length; PropiedadesArchivoActual.FactorCompresion = Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoComprimido) / Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoDescomprimido); PropiedadesArchivoActual.RazonCompresion = Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoDescomprimido) / Convert.ToDouble(PropiedadesArchivoActual.TamanoArchivoComprimido); PropiedadesArchivoActual.PorcentajeReduccion = (Convert.ToDouble(1) - PropiedadesArchivoActual.FactorCompresion).ToString(); PropiedadesArchivoActual.FormatoCompresion = ".lzw"; Factor FactorCompresion = new Factor(); FactorCompresion.GuaradarCompresiones(PropiedadesArchivoActual, "Huffman"); }; }