public void InitializeDictionary(byte[] text, string newName) { for (int i = 0; i < text.Length; i++) { string caracter = ByteGenerator.ConvertToString(new byte[] { text[i] }); if (!alphabet.ContainsValue(caracter)) { alphabet.Add(cont, caracter); cont++; } } string folder = @"C:\Compressions\"; string fullPath = folder + newName; string content = ""; foreach (var item in alphabet) { KeyValuePair <long, string> pair = item; content += pair.Value; } using (FileStream writer = new FileStream(fullPath, FileMode.OpenOrCreate)) { byte[] ToWrite = ByteGenerator.ConvertToBytes(content); for (int i = 0; i < ToWrite.Length; i++) { byte[] temp = { ToWrite[i] }; writer.Seek(0, SeekOrigin.End); writer.Write(temp, 0, 1); } writer.Seek(0, SeekOrigin.End); writer.Write(ByteGenerator.ConvertToBytes("@@@"), 0, 3); } }
public void decode(Node root, ref int index, BitArray str, ref string result) { if (root == null) { return; } if (root.Left == null && root.Right == null) { byte[] toStr = { root.byt }; result += ByteGenerator.ConvertToString(toStr); return; } index++; if (str[index] == false) { decode(root.Left, ref index, str, ref result); } else { decode(root.Right, ref index, str, ref result); } }
public void DecodeFile(byte[] text, string newName, string name) { string txt = ByteGenerator.ConvertToString(text); string[] nodes = txt.Split("@@@"); int start = (nodes.Length - 1) * 3; Dictionary <byte, int> freq = new Dictionary <byte, int>(); for (int i = 0; i < nodes.Length - 1; i++) { string val = nodes[i]; string character = ""; string integer = ""; if (int.TryParse(val[0].ToString(), out _)) { character += val[0]; for (int j = 1; j < val.Length; j++) { integer += val[j]; start++; } } else { for (int j = 0; j < val.Length; j++) { if (!int.TryParse(val[j].ToString(), out _)) { character += val[j]; } else { integer += val[j]; start++; } } } byte[] bt; if (character == "NTR") { bt = ByteGenerator.ConvertToBytes('\n'.ToString()); } else if (character == "NDL") { bt = ByteGenerator.ConvertToBytes('\r'.ToString()); } else { bt = ByteGenerator.ConvertToBytes(character.ToString()); } start += character.Length; if (!freq.ContainsKey(bt[0])) { freq.Add(bt[0], Convert.ToInt32(integer)); } } BuildHuffman(freq); BitArray result = ToBitArray(text.Skip(start).ToArray()); int index = -1; string decoded = ""; while (index < result.Length - 1) { decode(this.root, ref index, result, ref decoded); } string folder = @"C:\Compressions\"; string fullPath = folder + newName; using (StreamWriter sw = new StreamWriter(fullPath)) { sw.Write(decoded); } }
public void Decompress(byte[] txt, string name) { string content = ByteGenerator.ConvertToString(txt); string[] archivo = content.Split("@@@"); byte[] originalDict = ByteGenerator.ConvertToBytes(archivo[0]); byte[] text = ByteGenerator.ConvertToBytes(archivo[1]); int TextPosition = originalDict.Length + 3; //contruir de nuevo el diccionario for (int i = 0; i < originalDict.Length; i++) { alphabet.Add(cont, ByteGenerator.ConvertToString(new byte[] { originalDict[i] })); cont++; } //empezar a descifrar //string outText = ""; string single = ""; int newCode = 0; byte[] oldByte = { txt[TextPosition] }; TextPosition++; int oldCode = oldByte[0]; //string caracter = ByteGenerator.ConvertToString(oldByte); string caracter = alphabet[oldCode]; string folder = @"C:\Decompressions\"; string fullpath = folder + name; using (FileStream writer = new FileStream(fullpath, FileMode.OpenOrCreate)) { byte[] byt = ByteGenerator.ConvertToBytes(caracter); writer.Write(byt, 0, 1); } for (int i = TextPosition; i < txt.Length; i++) { byte[] byt = { txt[i] }; newCode = byt[0]; if (!alphabet.ContainsKey(newCode)) //si el codigo nuevo no está en el diccionario { single = alphabet[oldByte[0]]; single += caracter; } else { single = alphabet[byt[0]]; //ByteGenerator.ConvertToString(byt); } //outText += single; byte[] salida; using (FileStream writer = new FileStream(fullpath, FileMode.Append)) { salida = ByteGenerator.ConvertToBytes(single); writer.Write(salida, 0, salida.Length); } caracter = single[0].ToString(); alphabet.Add(cont, alphabet[oldByte[0]] + caracter); cont++; oldByte = byt; } }