コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }