示例#1
0
        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);
            }
        }
示例#2
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);
            }
        }
示例#3
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);
            }
        }
示例#4
0
        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;
            }
        }