Example #1
0
        //метод исправления ошибок
        private void MistakeCorrection()
        {
            try
            {
                string binaryNumber;
                if (EnterTextBox.Text != string.Empty)
                {
                    binaryNumber = EnterTextBox.Text; //вводим двоичное число из текстбокса
                    for (int i = 0; i < binaryNumber.Length; i++)
                    {
                        int temp = Convert.ToInt32(Convert.ToString(binaryNumber[i]));
                        if ((temp != 0) && (temp != 1))
                        {
                            MessageBox.Show("Сообщение должно быть двоичным, попробуйте ещё раз!");
                            EnterTextBox.Clear();
                            CodeTextBox.Clear();
                            return;
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Не введено сообщение!");
                    CodeTextBox.Clear();
                    return;
                }

                int n = binaryNumber.Length;    //длина введённого числа в двоичной форме
                int m = BinaryClass.SearchM(n); //для заданного n ищем длину закодированного слова
                int countControlSymbols = m - n;
                //количество контрольных символов в зашифрованном слове, передаём это в матрицу

                int[] code = new int[m]; //массив для закодированного слова
                int   deg = 0, count = 0;

                //по введённым данным строим матрицу Хэмминга
                var hammingsMatrix = BuildMatrix.BuildHMatrix(countControlSymbols);

                //на контрольные символы ставим временно "9", а на информационные - исходное слово
                for (int i = 0; i < m; i++)
                {
                    //если выполняется это условие - значит нашли контрольный символ
                    if ((i + 1) == Math.Pow(2, deg))
                    {
                        deg++;
                        code[i] = 9;
                    }
                    //иначе вставляем исходное слово
                    else
                    {
                        code[i] = int.Parse(Convert.ToString(binaryNumber[count]));
                        count++;
                    }
                }

                int hammingsMatrixLines  = hammingsMatrix.GetLength(0); //количество строк в матрице Хэмминга
                int hammingsMatrixColumn = hammingsMatrix.GetLength(1); //количество столбцов в матрице Хэмминга
                int countcontrol         = -1;

                //вычисляем итоговые контрольные символы
                for (int i = 0; i < m; i++)
                {
                    int flag = 1;
                    int sum  = 0;

                    if (code[i] == 9)
                    {
                        countcontrol++;
                        int line = hammingsMatrixLines - 1 - countcontrol;

                        for (int j = 0; j < hammingsMatrixColumn; j++)
                        {
                            if ((hammingsMatrix[line, j] == 1) && (flag == 1))
                            {
                                flag = 0;
                                continue;
                            }
                            if ((hammingsMatrix[line, j] == 1) && (flag == 0))
                            {
                                if (j <= code.Length - 1)
                                {
                                    sum = sum + code[j];
                                }
                            }
                        }
                        code[i] = sum % 2;
                    }
                }

                //переводим массив в строковую переменную
                string vernyVyvod = "";
                foreach (var v in code)
                {
                    vernyVyvod = vernyVyvod + Convert.ToString(v);
                }

                var rnd     = new Random();
                var mistake = rnd.Next(1, m + 1);
                code[mistake - 1] = BinaryClass.ReverseSym(code[mistake - 1]); //генерируем ошибку

                //переводим массив в строковую переменную и выводим в текстбокс
                string vyvod = "";
                foreach (var v in code)
                {
                    vyvod = vyvod + Convert.ToString(v);
                }
                CodeTextBox.Text = vyvod;

                //считаем, сколько единиц в закодированном сообщении
                int countN = 0;
                for (int i = 0; i < m; i++)
                {
                    if (code[i] == 1)
                    {
                        countN++;
                    }
                }

                //вспомогательный массив для вычисления синдрома и его длина
                int   countAuxArray  = countControlSymbols * countN;
                int[] auxiliaryArray = new int[countAuxArray];

                //в вспомогательный массив записываем те столбцы матрицы Хэмминга,
                //которые соответствуют единице в закодированном сообщении длины m
                int index = 0;
                for (int i = 0; i < m; i++)
                {
                    if (code[i] == 1)
                    {
                        for (int j = 0; j < hammingsMatrixLines; j++)
                        {
                            auxiliaryArray[index] = hammingsMatrix[j, i];
                            index++;
                        }
                    }
                }

                //ищем сумму цифр на определённых позициях (синдром по сути)
                //результат - номер позиции ошибки в двоичной сс
                int positionmistake = 0;
                for (int i = 0; i < countControlSymbols; i++)
                {
                    var result = 0;
                    for (int t = 0; t < countN; t++)
                    {
                        if ((i + countControlSymbols * t) < countAuxArray)
                        {
                            result = result + auxiliaryArray[i + countControlSymbols * t];
                        }
                    }
                    positionmistake = positionmistake * 10 + result % 2;
                }

                //переводим номер ошибки в десятичную сс и выводим в текстбокс
                positionmistake              = BinaryClass.TranslationOfBinary(positionmistake);
                PositionMistakeTextBox.Text  = Convert.ToString(positionmistake);
                MessWithourErrorTextBox.Text = vernyVyvod;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Example #2
0
        //метод кодирования сообщения по методу Хаффмана
        private void CodeMessage()
        {
            try
            {
                string binaryNumber;
                if (EnterTextBox.Text != string.Empty)
                {
                    binaryNumber = EnterTextBox.Text; //вводим двоичное число из текстбокса
                    for (int i = 0; i < binaryNumber.Length; i++)
                    {
                        int temp = Convert.ToInt32(Convert.ToString(binaryNumber[i]));
                        if ((temp != 0) && (temp != 1))
                        {
                            MessageBox.Show("Сообщение должно быть двоичным, попробуйте ещё раз!");
                            EnterTextBox.Clear();
                            CodeTextBox.Clear();
                            return;
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Не введено сообщение!");
                    CodeTextBox.Clear();
                    return;
                }

                int n = binaryNumber.Length;    //длина введённого числа в двоичной форме
                int m = BinaryClass.SearchM(n); //для заданного n ищем длину закодированного слова
                int countControlSymbols = m - n;
                //количество контрольных символов в зашифрованном слове, передаём это в матрицу

                int[] code = new int[m]; //массив для закодированного слова
                int   deg = 0, count = 0;

                //по введённым данным строим матрицу Хэмминга
                var hammingsMatrix = BuildMatrix.BuildHMatrix(countControlSymbols);

                //на контрольные символы ставим временно "9", а на информационные - исходное слово
                for (int i = 0; i < m; i++)
                {
                    //если выполняется это условие - значит нашли контрольный символ
                    if ((i + 1) == Math.Pow(2, deg))
                    {
                        deg++;
                        code[i] = 9;
                    }
                    //иначе вставляем исходное слово
                    else
                    {
                        code[i] = int.Parse(Convert.ToString(binaryNumber[count]));
                        count++;
                    }
                }

                int hammingsMatrixLines  = hammingsMatrix.GetLength(0); //количество строк в матрице Хэмминга
                int hammingsMatrixColumn = hammingsMatrix.GetLength(1); //количество столбцов в матрице Хэмминга
                int countcontrol         = -1;

                //вычисляем итоговые контрольные символы
                for (int i = 0; i < m; i++)
                {
                    int flag = 1;
                    int sum  = 0;

                    if (code[i] == 9)
                    {
                        countcontrol++;
                        int line = hammingsMatrixLines - 1 - countcontrol;

                        for (int j = 0; j < hammingsMatrixColumn; j++)
                        {
                            if ((hammingsMatrix[line, j] == 1) && (flag == 1))
                            {
                                flag = 0;
                                continue;
                            }
                            if ((hammingsMatrix[line, j] == 1) && (flag == 0))
                            {
                                if (j <= code.Length - 1)
                                {
                                    sum = sum + code[j];
                                }
                            }
                        }
                        code[i] = sum % 2;
                    }
                }

                //переводим массив в строковую переменную и выводим в текстбокс
                string vyvod = "";
                foreach (var v in code)
                {
                    vyvod = vyvod + Convert.ToString(v);
                }
                CodeTextBox.Text = vyvod;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }