void WriteTree(List <Node> PList, string fullPath) { foreach (var item in PList) { byte[] temp = { item.byt }; using (FileStream writer = new FileStream(fullPath, FileMode.OpenOrCreate)) { writer.Seek(0, SeekOrigin.End); if (ByteGenerator.ConvertToString(temp) == '\n'.ToString()) { writer.Write(ByteGenerator.ConvertToBytes("NTR"), 0, 3); } else if (ByteGenerator.ConvertToString(temp) == '\r'.ToString()) { writer.Write(ByteGenerator.ConvertToBytes("NDL"), 0, 3); } else { writer.Write(temp, 0, 1); } writer.Seek(0, SeekOrigin.End); writer.Write(ByteGenerator.ConvertToBytes(item.freq.ToString()), 0, item.freq.ToString().Length); 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); } }