//метод исправления ошибок 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); } }
//метод кодирования сообщения по методу Хаффмана 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); } }