예제 #1
0
        public string Decompress(byte[] input)
        {
            var data = new CompressedData();

            data.Load(input);

            _huffmanTree.Build(data.Frequencies);

            var originalLength = data.OriginalLength;

            var output = new char[originalLength];

            var bits = new BitReader(data.Data);

            var node = _huffmanTree.Root;

            var position = 0;

            while (position < originalLength)
            {
                if (node.Character != '\0')
                {
                    output[position] = node.Character;

                    node = _huffmanTree.Root;

                    position++;
                }

                node = bits.Read() ? node.Right : node.Left;
            }

            return(new string(output));
        }
예제 #2
0
        public void Execute()
        {
            var file = File.ReadAllText(_options.FileName);

            var frequencyCalculator = new FrequencyCalculator();

            var frequencies = frequencyCalculator.GetFrequencies(file);

            _tree.Build(frequencies);

            _visualisation = File.ReadAllText("Supporting Files\\Template.html");

            _visualisation = _visualisation.Replace("{document}", Path.GetFileNameWithoutExtension(_options.FileName));

            _visualisation = _visualisation.Replace("{css}", File.ReadAllText("Supporting Files\\Styles.css"));

            _visualisation = _visualisation.Replace("{nodes}", $"<ul>{ProcessNode(_tree.Root)}</ul>");

            var tempFile = Path.GetTempFileName().Replace(".tmp", ".html");

            File.WriteAllText(tempFile, _visualisation);

            Process.Start(new ProcessStartInfo
            {
                FileName        = tempFile,
                UseShellExecute = true
            });

            if (!string.IsNullOrWhiteSpace(_options.OutputFileName))
            {
                File.WriteAllText(_options.OutputFileName, _visualisation);
            }
        }
        // Проверка правильности строки для кода Хаффмана
        public static ReturnResult CheckString04(string reply, string generated)
        {
            try
            {
                bool yes = true;

                string input = generated;

                if (input.CompareTo("") == 0)
                {
                    return new ReturnResult(false, "Вы не ввели текст!");
                }

                HuffmanTree huffmanTree = new HuffmanTree();

                // Строим дерево Хаффмана по весам слов
                huffmanTree.Build(input);

                // Кодируем
                BitArray encoded = (BitArray)huffmanTree.Encode(input);

                if (huffmanTree.str != reply)
                    yes = false;

                if (yes)
                    return new ReturnResult(true, "Абсолютно верное решение! ");

                return new ReturnResult(false, "Это не оптимальный код Хаффмана. Вот он: " + huffmanTree.str);

            }
            catch (Exception e)
            {
                return new ReturnResult(false, "Ошибка ввода! " + e.Message);
            }
        }
예제 #4
0
        public static string Process(string text)
        {
            var n    = text.Length;
            var list = new List <CharFreq>();

            for (var i = 0; i < n; ++i)
            {
                var c       = text[i];
                var element = list.FirstOrDefault(v => v.Ch == c);
                if (element != null)
                {
                    ++element.Freq;
                    continue;
                }

                list.Add(new CharFreq
                {
                    Ch   = c,
                    Freq = 1
                });
            }

            var root = HuffmanTree.Build(list);

            var leafNodes = 0;
            var output    = string.Empty;

            InorderTraversal(root, string.Empty, ref leafNodes, ref output);
            output += $"\r\n# characters = {n}\r\n";
            output += $"# leaf nodes = {leafNodes}\r\n";
            output += $"% compressed = {100.0 - 100.0 * leafNodes / n:F2}\r\n";

            return(string.Concat(text.Select(c => list.FirstOrDefault(value => value.Ch == c)?.Label ?? string.Empty)));
        }
예제 #5
0
파일: Program.cs 프로젝트: enyaaad/Huffman
        static void Main(string[] args)
        {
            BitArray encoded;
            char     input = ' ';
            string   pathtofile;

            Console.WriteLine("Input path to file");
            pathtofile = Console.ReadLine();
            HuffmanTree huffmanTree = new HuffmanTree();

            using (BinaryReader sr = new BinaryReader(new FileStream(pathtofile, FileMode.Open), Encoding.UTF8))
                huffmanTree.Build(input, sr);
            using (BinaryReader sr = new BinaryReader(new FileStream(pathtofile, FileMode.Open), Encoding.UTF8))
                encoded = huffmanTree.Encode(input, sr);

            Console.Write("Encoded ");
            string bytestr = "";
            int    i       = 0;

            while (i < encoded.Length)
            {
                if (bytestr.Length < 8)
                {
                    bytestr += encoded[i] ? 1 : 0.ToString();
                    i++;
                }
                else
                {
                    HuffmanTree.bytes.Add(Convert.ToByte(bytestr, 2));
                    bytestr = "";
                }
            }

            if (bytestr.Length <= 8)
            {
                while (bytestr.Length < 8)
                {
                    bytestr += "0";
                    Node.Delta++;
                }
                HuffmanTree.bytes.Add(Convert.ToByte(bytestr, 2));
            }
            using (StreamWriter sw = new StreamWriter("archive.txt", false))
            {
                sw.Write(Node.EncTree(huffmanTree.Root));
            }

            using (FileStream fs = new FileStream("archive.txt", FileMode.Append))
            {
                fs.Write(HuffmanTree.bytes.ToArray());
                fs.WriteByte(Node.Delta);
            }
            Console.WriteLine();

            huffmanTree.Root = new Node();
            huffmanTree.Decode();
            Console.WriteLine("Decoded");
            Console.WriteLine("All done");
            Console.ReadLine();
        }
예제 #6
0
파일: SCPSEncoder.cs 프로젝트: mukatk/scps
        public static void Encode(string arquivo)
        {
            LZWEncoder encoder  = new LZWEncoder();
            string     conteudo = Arquivo.Abrir(arquivo);

            Console.WriteLine("Iniciada a compressão");
            DateTime dataInicial = DateTime.Now;

            //Codificação LZW
            string lzwEncoded = encoder.Encode(conteudo);

            HuffmanTree huffman = new HuffmanTree();

            //Criação da árvore huffman
            huffman.Build(lzwEncoded);

            //Codificação huffman
            var huffmanEncoded = huffman.Encode(lzwEncoded);

            DateTime dataFinal = DateTime.Now;

            string tempoDecorrido = (dataFinal - dataInicial).TotalSeconds.ToString("N2");

            //Contabiliza apenas os tempos para compressão. Igora tempo de IO
            Console.WriteLine($"Arquivo comprimido em {tempoDecorrido} segundos");

            byte[] ret = new byte[(huffmanEncoded.Length - 1) / 8 + 1];
            huffmanEncoded.CopyTo(ret, 0);

            //Gravando arquivo comprimido
            Arquivo.Gravar(ret, $"{arquivo.Split('.')[0]}.scps");
        }
예제 #7
0
        public HuffmanTreeTests()
        {
            _tree = new HuffmanTree();

            var frequencies = GetFrequencies();

            _tree.Build(frequencies);
        }
예제 #8
0
        public void TestHuffmanCodingProblem()
        {
            HuffmanTree hfmTree = new HuffmanTree();
            string      input   = "sankara loves devi";

            hfmTree.Build(input);

            BitArray encoded = hfmTree.Encode(input);

            string decoded = hfmTree.Decode(encoded);

            Assert.IsTrue(input == decoded);
        }
예제 #9
0
        private void WriteHuffBuffer(byte off, byte maxlen)
        {
            if (StringBuffer[off] == 0)
            {
                WriteFlag(false);
                WriteInt(0, 8);
                return;
            }

            HuffmanTree.Build();

            var len = Strlen(StringBuffer, off);

            if (len > maxlen)
            {
                len = maxlen;
            }

            var numBits = 0U;

            for (var i = 0; i < len; ++i)
            {
                numBits += HuffmanTree.Leaves[StringBuffer[off + i]].NumBits;
            }

            var flag = WriteFlag(numBits < (len * 8));

            WriteInt(len, 8);

            if (flag)
            {
                for (var i = 0; i < len; ++i)
                {
                    var leaf = HuffmanTree.Leaves[StringBuffer[off + i]];

                    var code = BitConverter.GetBytes(leaf.Code);

                    WriteBits(leaf.NumBits, code);
                }
            }
            else
            {
                var temp = new byte[len];

                Array.Copy(StringBuffer, off, temp, 0, len);

                Write(len, temp);
            }
        }
예제 #10
0
        public static void TestHuffman()
        {
            char[] input2 = "eeeeeeeeeeeeeeeeeeeeeeeedddddddddddddddddddddddccccccccccbbbbbbbbbbbaaaaaaaaaaaxxxyyywvsr".ToCharArray();
            LogLine("Input content:");
            LogLine(new string(input2));
            LogLine();

            // Build huffman tree
            HuffmanTree tree = new HuffmanTree();

            tree.Build(input2);
            tree.Print();
            tree.RightBalance();
            tree.Print();
        }
예제 #11
0
        private void button1_Click(object sender, EventArgs e)
        {
            int i = 0;

            richTextBox1.Text = "";
            htree.Build(textBox1.Text);
            encoded = htree.Encode(textBox1.Text);
            foreach (bool bit in encoded)
            {
                richTextBox1.Text += ((bit ? 1 : 0).ToString() + " ");
            }
            foreach (KeyValuePair <char, int> item in htree.Frequencies)
            {
                richTextBox3.Text += ("Символ: " + item.Key + "\t Кількість: " + item.Value.ToString() + "\t Частота: " + (Math.Round((float)item.Value / textBox1.Text.Length, 3)) + "\t Код " + htree.codec.ToArray()[i] + "\n");
                i++;
            }
        }
예제 #12
0
 private void button7_Click(object sender, EventArgs e)
 {
     if (richTextBox7.Text == " ")
     {
         MessageBox.Show("Please Enter A Text To Compress");
     }
     else
     {
         input       = richTextBox7.Text;
         huffmanTree = new HuffmanTree();
         huffmanTree.Build(input);
         encoded = huffmanTree.Encode(input);
         richTextBox10.Visible = true;
         for (int i = 0; i < encoded.Count; i++)
         {
             richTextBox10.Text += (encoded[i] ? 1 : 0).ToString();
         }
     }
 }
예제 #13
0
        private void ReadHuffBuffer(out string stringBuffer, byte off = 0)
        {
            HuffmanTree.Build();

            uint len;

            if (ReadFlag())
            {
                len = ReadInt(8);

                for (var i = 0; i < len; ++i)
                {
                    var current = HuffmanTree.Root;

                    while (true)
                    {
                        if (!HuffmanTree.IsLeaf(current))
                        {
                            current = ReadFlag() ? current.Right : current.Left;
                            continue;
                        }

                        StringBuffer[i + off] = current.Symbol;
                        break;
                    }
                }
            }
            else
            {
                len = ReadInt(8);

                var buff = new byte[len];

                Read(len, buff);

                Array.Copy(buff, 0, StringBuffer, off, len);

                StringBuffer[off + len] = 0;
            }

            stringBuffer = Encoding.UTF8.GetString(StringBuffer, 0, (int)(len + off));
        }
예제 #14
0
        private void button9_Click(object sender, EventArgs e)
        {
            var watch  = new System.Diagnostics.Stopwatch();
            var watch2 = new System.Diagnostics.Stopwatch();

            for (int s = min; s < max; s += step)
            {
                generatingbench(s);
                BitArray temp = null;
                for (int i = 0; i < nor; i++)
                {
                    watch.Restart();
                    compress(inputbench.ToString());
                    huffmanTree = new HuffmanTree();
                    huffmanTree.Build(compressed.ToString());
                    BitArray encoded2 = huffmanTree.Encode(compressed.ToString());
                    benchmarktime1 += watch.Elapsed.TotalMilliseconds;
                    if (i == 0)
                    {
                        temp = huffmanTree.Encode(compressed.ToString());
                    }
                    watch.Stop();
                }
                //==================================================================================================
                for (int i = 0; i < nor; i++)
                {
                    watch2.Restart();
                    decompress();
                    string decoded = huffmanTree.Decode(temp);
                    benchmarktime2 += watch2.Elapsed.TotalMilliseconds;
                    watch2.Stop();
                }
                if (s == min)
                {
                    this.richTextBox13.Text = "Data Size \t" + "Compress time \t" + "Decompress Time \t" + "\n" + "=====================================================" + "\n";
                }
                this.richTextBox13.Text += s + "\t\t" + Math.Round((benchmarktime1 / nor), 3).ToString() + "\t\t" + Math.Round((benchmarktime2 / nor), 3).ToString() + "\n";
                benchmarktime1           = 0;
                benchmarktime2           = 0;
            }
        }
        // Проверка правильности строки для кода Хаффмана
        public static string CheckString04(string reply, string generated)
        {
            try
            {
                bool yes = true;

                string input = generated;

                if (input.CompareTo("") == 0)
                {
                    return("Вы не ввели текст!");
                }

                HuffmanTree huffmanTree = new HuffmanTree();

                // Строим дерево Хаффмана по весам слов
                huffmanTree.Build(input);

                // Кодируем
                BitArray encoded = (BitArray)huffmanTree.Encode(input);

                if (huffmanTree.str != reply)
                {
                    yes = false;
                }


                if (yes)
                {
                    return("Абсолютно верное решение! ");
                }

                return("Это не оптимальный код Хаффмана. Вот он: " + huffmanTree.str);
            }
            catch (Exception e)
            {
                return("Ошибка ввода! " + e.Message);
            }
        }
예제 #16
0
        private HuffmanTree InitializeHuffmanTree()
        {
            /*
             * List<string> items = new List<string>();
             * foreach(TXTRow row in ArmorTXT.Rows)
             * {
             *  items.Add(row["code"]);
             * }
             * foreach (TXTRow row in WeaponsTXT.Rows)
             * {
             *  items.Add(row["code"]);
             * }
             * foreach (TXTRow row in MiscTXT.Rows)
             * {
             *  items.Add(row["code"]);
             * }
             */
            var itemCodeTree = new HuffmanTree();

            itemCodeTree.Build(new List <string>());
            return(itemCodeTree);
        }
예제 #17
0
            public static         FrequencyRecord[] GetFrequencyDictionary(string text)
            {
                var result      = new List <FrequencyRecord>();
                var huffmanTree = new HuffmanTree();

                huffmanTree.Build(text);

                _entropy = 0;

                for (int i = 0; i < huffmanTree.Frequencies.Count; i++)
                {
                    var record = new FrequencyRecord();
                    record._char = huffmanTree.Frequencies.ElementAt(i).Key;

                    record._freq        = huffmanTree.Frequencies.ElementAt(i).Value;
                    record._freqPercent = Math.Round(record._freq / ((float)text.Length), 2);
                    foreach (var item in huffmanTree.EncodeChar(record._char))
                    {
                        record._code += (item ? 1 : 0);
                    }
                    result.Add(record);
                    _entropy += Math.Round((-(result[i]._freqPercent * Math.Log(result[i]._freqPercent, 2))), 2);
                }

                BitArray encoded = huffmanTree.Encode(text);

                Console.Write("Encoded: ");
                var str = "";

                foreach (bool bit in encoded)
                {
                    str += (bit ? 1 : 0);
                }
                _avg    = Math.Round((float)str.Length / (float)text.Length, 2);
                _lenght = str.Length;
                return(result.ToArray());
            }
예제 #18
0
        public static byte[] Encode(string text)
        {
            HuffmanTree tree = HuffmanTree.Build(text);                                       // budowa drzewa
            var         dict = tree.Dictionary;                                               // słownik kodów

            var(encoded, padding) = Encode(text, dict);                                       // zakodowanie wiadomośc
            int maxLen = 4;
            int estimatedBufferSize = 1 + dict.Count * (1 + 1 + maxLen) + 1 + encoded.Length; // przewidywany rozmiar pliku wyjściowego
            var buff = new byte[estimatedBufferSize];                                         // utworzenie bufora

            using var ms = new MemoryStream(buff);
            // zapis kolejnych składowych formatu
            ms.WriteByte((byte)dict.Count);  // liczba znaków
            foreach (var kvp in dict)
            {
                ms.WriteByte((byte)kvp.Key);          // znak
                ms.WriteByte((byte)kvp.Value.Length); // długośc kodu
                ms.Write(kvp.Value.GetBytes().Item1); // kod
            }

            ms.WriteByte((byte)padding); // przesuniecie (margines do 8 bitów)
            ms.Write(encoded);           // zapis danych
            return(buff.AsSpan(0, (int)ms.Position).ToArray());
        }
예제 #19
0
        static void Main(string[] args)
        {
            Console.WriteLine("Veuillez entrer les éléments de facturation du client :");
            string      input       = Console.ReadLine();
            HuffmanTree huffmanTree = new HuffmanTree();

            // Construire l'arbre de huffman
            huffmanTree.Build(input);

            // Encoder
            BitArray encoded = huffmanTree.Encode(input);

            //on retourne le nombre d'octets du message lu au clavier
            Console.WriteLine();
            Console.WriteLine("Votre texte est de " + input.Length + " octets");

            //on ouvre une session de connexion sur gmail à travers smtp
            try
            {
                MailMessage mail       = new MailMessage();
                SmtpClient  SmtpServer = new SmtpClient("smtp.gmail.com");

                mail.From = new MailAddress("*****@*****.**"); //expéditeur
                mail.To.Add("*****@*****.**");          //recepteur
                mail.Subject = "Informations client";                 //objet

                //ic on affiche d'abord le message compréssé chez l'expéditeur
                Console.WriteLine();

                int cpt = 0; //j'initialise un compte ici pour avoir le nombre de bit à la fin de la compression
                Console.Write("Compressé: ");
                foreach (bool bit in encoded)
                {
                    Console.Write((bit ? 1 : 0) + "");
                    cpt = cpt + 1;
                }
                Console.WriteLine();
                Console.WriteLine("le texte compréssé est de " + (cpt / 8 + 1) + " octets");

                Console.WriteLine();
                Console.WriteLine("En cours d'envoi à " + mail.To + "...");

                /*foreach (bool bit in encoded)
                 * {
                 *  mail.Body = (bit ? 1 : 0) + "";
                 * }
                 * Console.WriteLine();*/

                string chaine;
                string message = "";
                foreach (bool bit in encoded)
                {
                    chaine = (bit ? 1 : 0) + "";

                    message = $"{message}{chaine}";
                }

                mail.Body = message;

                SmtpServer.Port        = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("*****@*****.**", "testisj2019");
                SmtpServer.EnableSsl   = true;

                Console.WriteLine();
                SmtpServer.Send(mail);
                Console.WriteLine("Votre mail à été envoyé avec succes!!!");//Message succes
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            //cette partie du code permet de lire les mails de l'adresse passée en paramètre
            try
            {
                using (Pop3 pop3 = new Pop3())
                {
                    pop3.ConnectSSL("pop.gmail.com"); // or ConnectSSL for SSL
                    pop3.Login("*****@*****.**", "mayelle2010");
                    List <string> uids = pop3.GetAll();
                    foreach (string uid in uids)
                    {
                        IMail email = new MailBuilder()
                                      .CreateFromEml(pop3.GetMessageByUID(uid));

                        Console.WriteLine("");
                        Console.WriteLine(email.Date);
                        Console.WriteLine(email.From);
                        Console.WriteLine(email.Subject);
                    }
                    pop3.Close();
                }
            }
            catch (Limilabs.Client.ServerException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
예제 #20
0
        void backWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            System.ComponentModel.BackgroundWorker b = sender as System.ComponentModel.BackgroundWorker;
            int samples = 32;

            short[] buffer = new short[samples];
            bw = new BinaryWriter(File.Open(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/Code.huf", FileMode.Create));

            stream = Bass.BASS_StreamCreateFile(path, 0L, 0L, BASSFlag.BASS_STREAM_DECODE);

            ww = new WaveWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/HufSound.wav", stream, true);
            int  mult = 0;
            long len  = Bass.BASS_ChannelGetLength(stream, BASSMode.BASS_POS_BYTES);

            while (Bass.BASS_ChannelIsActive(stream) == BASSActive.BASS_ACTIVE_PLAYING)
            {
                int length = Bass.BASS_ChannelGetData(stream, buffer, samples * 2);
                mult++;
                b.ReportProgress((int)(((samples * mult) * 100) / len * 2));
                List <short> listBuffer = new List <short>();
                HuffmanTree  tree       = new HuffmanTree();
                if (length > 0)
                {
                    listBuffer.AddRange(buffer);
                    short[] auxbuf = new short[buffer.Length];
                    auxbuf = buffer;
                    canvasWavComp.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new Action(delegate
                    {
                        //Whole Wave
                        //double xScale = canvasWavComp.Width / samples;

                        //Formula by Manuel García. Dude you're amazing.
                        //NOTE: multiply by 2 'cos I supoused some relation with Nyquist Theorem
                        double xScale = (canvasWavComp.Width * samples) / len * 2;

                        double yScale      = (canvasWavComp.Height / (double)(amplitude * 2)) * ((double)amplitude / MAX_AMP);
                        Polyline graphLine = new Polyline();

                        //This Line is used to move on the x axis
                        Canvas.SetLeft(graphLine, xAxis);

                        graphLine.Stroke          = new SolidColorBrush(Color.FromRgb(244, 67, 54));
                        graphLine.StrokeThickness = 2;
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            graphLine.Points.Add(new Point(xScale * i, (canvasWavComp.Height / 2) - (buffer[i] * yScale)));
                        }
                        xAxis += xScale;
                        //canvasWavComp.Children.Clear();
                        canvasWavComp.Children.Add(graphLine);
                    }));
                    double entaux = 0;
                    foreach (var sym in listBuffer.GroupBy(i => i))
                    {
                        NodeHuf nodeHuf = new NodeHuf();
                        nodeHuf.Symbol    = sym.Key;
                        nodeHuf.Frequency = sym.Count();
                        nodeHuf.Right     = nodeHuf.Left = null;
                        tree.Add(nodeHuf);
                        double prob = (double)nodeHuf.Frequency / samples;
                        //entropy -= prob * (Math.Log(prob) / Math.Log(2));
                        entaux   += prob * Math.Log(1 / (prob), 2);
                        entauxlbl = entaux;
                    }
                    entropy += entaux;
                    entcount++;
                    tree.Build();


                    //Encode
                    System.Collections.BitArray encoded = tree.Encode(auxbuf);
                    byte[] arrayBytes = new byte[encoded.Length / 8 + (encoded.Length % 8 == 0 ? 0 : 1)];
                    encoded.CopyTo(arrayBytes, 0);
                    File.WriteAllBytes("Compress.bin", arrayBytes);

                    //Decode
                    byte[] data;
                    Stream fs = File.OpenRead("Compress.bin");
                    data = new byte[fs.Length];
                    fs.Read(data, 0, data.Length);
                    System.Collections.BitArray bitDec = new System.Collections.BitArray(data);

                    short[] decoded = tree.Decode(bitDec);
                    if (decoded.Length > 0)
                    {
                        ww.Write(decoded, length);
                    }
                    bw.Write(data);
                    fs.Close();
                }
            }
            //Delete temporaly file
            File.Delete("Compress.bin");

            //Close de Stream WAV ww
            ww.Close();

            //If you not add this line, the backgroundworker will be restat but when file is create again
            //there will be an incongruence because the bw never was closed.
            bw.Close();

            entropy /= entcount;// (len / samples);
            entcount = 0;
        }