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); } }