Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lab3
{
class Program
{
static void Main(string[] args)
{
string s = "";
string s_unic = "";
string s_polin_0 = "";
string s_polin = "";
string s_polin_err = "";
string s_polin_cor = "";
string s_unic_fix = "";
string s_fix = "";
string s_b_unic = "";
string s_b_polin_0 = "";
string s_b_polin = "";
string s_b_polin_err = "";
string s_b_polin_cor = "";
string s_b_unic_fix = "";
string s_b_fix = "";
Console.WriteLine("Передача данных с помощью полиномиального кодирования (32, 6)");
Console.WriteLine("Исходная строка:");
//s = "Лабораторная работа №3.";
s = "Лаба3 ";
// Если длина строки нечетная - добавляем в конце "пробел"
if (s.Length % 2 == 1)
{
s = s + " ";
}
// Преобразуем строку в массив символов
char[] b = s.ToCharArray();
Console.WriteLine(s);
// Обрабатываем строку по 2 символа
for (int i = 0; i < b.Length; i += 2)
{
// Преобразуем Юникод каждого символа в двоичный код, а затем преобразуем в строку, длиной 16 символов (общая длина строки станет 32)
s_b_unic = Program.ToBinary(Convert.ToInt64(b[i])) + Program.ToBinary(Convert.ToInt64(b[i + 1]));
// Вставляем контрольные биты в виде 0, на места с индексом 2^n-1 (0, 1, 3, 7, 15, ...)
s_b_polin_0 = Program.Pol_cod_0(s_b_unic);
// Делаем вычисление значения контрольных бит (если кол-во 1 в разрядах, подчиненных контрольному биту нечетное, то ставим 1, иначе 0)
s_b_polin = Program.Pol_cod_zap(s_b_polin_0);
// Делаем 1 ошибку в каждом слове в случайно выбранном бите
s_b_polin_err = Program.Pol_cod_err(s_b_polin);
// Выполняем коррекцию ошибки, заново вычислив значения контрольных бит (если контрольные биты отличаются, то индекс ошибочного бита вычисляется путем суммирования индексов отличающихся контрольных бит)
s_b_polin_cor = Program.Pol_cod_cor(s_b_polin_err);
// Производим удаление избыточной информации (контрольных бит)
s_b_unic_fix = Program.Unic_fix(s_b_polin_cor);
// Делаем обратное преобразование из двоичного кода в символ, а затем преобразуем в строку
s_b_fix = Program.Char_fix(s_b_unic_fix);
s_unic = s_unic + s_b_unic + " ";
s_polin_0 = s_polin_0 + s_b_polin_0 + " ";
s_polin = s_polin + s_b_polin + " ";
s_polin_err = s_polin_err + s_b_polin_err + " ";
s_polin_cor = s_polin_cor + s_b_polin_cor + " ";
s_unic_fix = s_unic_fix + s_b_unic_fix + " ";
s_fix = s_fix + s_b_fix;
}
Console.WriteLine("");
Console.WriteLine("Сообщение без контрольных бит");
Console.WriteLine(s_unic);
//Console.WriteLine();
//Console.WriteLine(s_polin_0);
Console.WriteLine("");
Console.WriteLine("Сообщение с контрольными битами");
Console.WriteLine(s_polin);
Console.WriteLine("");
Console.WriteLine("Сообщение с контрольными битами с ошибкой в 1 бите");
Console.WriteLine(s_polin_err);
Console.WriteLine("");
Console.WriteLine("Восстановленное сообщение с контрольными битами");
Console.WriteLine(s_polin_cor);
Console.WriteLine("");
Console.WriteLine("Восстановленное сообщение без контрольных бит");
Console.WriteLine(s_unic_fix);
Console.WriteLine("");
Console.WriteLine("Восстановленное сообщение");
Console.WriteLine(s_fix);
Console.ReadLine();
}
static string ToBinary(Int64 Decimal)
{
Int64 BinaryHolder;
char[] BinaryArray;
string BinaryResult = "";
while (Decimal > 0)
{
BinaryHolder = Decimal % 2;
BinaryResult += BinaryHolder;
Decimal = Decimal / 2;
}
BinaryArray = BinaryResult.ToCharArray();
Array.Reverse(BinaryArray);
BinaryResult = new string(BinaryArray);
//Если длина слова меньше 16, то добавляем нули вперед
for (int i = BinaryResult.Length; i < 16; i++)
{
BinaryResult = "0" + BinaryResult;
}
return BinaryResult;
}
static string Pol_cod_0(string s)
{
string pol_cod = "";
string pol_cod_beg = "";
string pol_cod_end = "";
int st = 0;
pol_cod = s;
for (int i = 0; i < s.Length; i++)
{
if (i == (System.Math.Pow(2, st) - 1)) // Если индекс равен (2 в степени st - 1), то разбиваем строку pol_cod на 2 подстроки и вставляем между ними '0'
{
st++;
if (i > 0)
{
pol_cod_beg = pol_cod.Substring(0, i);
}
pol_cod_end = pol_cod.Substring(i, pol_cod.Length - i);
pol_cod = pol_cod_beg + "0" + pol_cod_end;
}
}
return pol_cod;
}
static string Pol_cod_zap(string s)
{
string pol_cod = "";
char[] BinaryArray;
int st = 0;
int k_1 = 0;
int ind_kb = 0;
int ind_kb_end = 0;
int len_kb = 0;
BinaryArray = s.ToCharArray(); // Преобразуем строку в массив символов
for (int i = 0; i < s.Length; i++)
{
if (i == (System.Math.Pow(2, st) - 1))
{
k_1 = 0;
ind_kb = i; // Индекс контрольного бита блока
len_kb = i + 1; // кол-во подчиненных контрольному биту бит в блоке
ind_kb_end = ind_kb + len_kb - 1; // Индекс конца блока
if (ind_kb_end > s.Length - 1) // Если индекс конца блока выходит за пределы длины строки, то присваиваем ему индекс последнего бита в строке
{
ind_kb_end = s.Length - 1;
}
for (int j = i; j < s.Length; j++) // Цикл от начала контрольного бита до конца строки
{
if ((j >= ind_kb) && (j <= ind_kb_end) && (BinaryArray[j] == '1')) // Если текущий индекс входит в блок и значение равно '1', то добавляем 1 в счетчик
{
k_1++;
}
if (j == ind_kb_end + 1) // Если текущий бит - следующий за концом очередного блока, то вычисляем индексы начала и конца следующего блока
{
ind_kb = ind_kb + 2 * len_kb;
ind_kb_end = ind_kb_end + 2 * len_kb;
}
}
if (k_1 % 2 == 1) // Если кол-во '1' нечетное, то в контрольный бит записываем '1'
{
BinaryArray[i] = '1';
}
st++; // Добавляем 1 к значению степени
}
}
pol_cod = new string(BinaryArray); // Преобразуем массив символов в строку
return pol_cod;
}
static string Pol_cod_err(string s)
{
System.Threading.Thread.Sleep(10);
Random rd = new Random();
int err_i = rd.Next(0, s.Length - 1); //числа от 0 до 31
char[] BinaryArray = s.ToCharArray();
if (BinaryArray[err_i] == '0') // Инвертируем значение бита, в котором будет "ошибка"
{
BinaryArray[err_i] = '1';
}
else
{
BinaryArray[err_i] = '0';
}
string pol_cod = new string(BinaryArray);
return pol_cod;
}
static string Pol_cod_cor(string s)
{
string pol_cod = "";
char[] BinaryArray;
char[] BinaryArray_2;
int st = 0;
int k_1 = 0;
int ind_kb = 0;
int ind_kb_end = 0;
int len_kb = 0;
int ssum = 0;
BinaryArray = s.ToCharArray();
// Обнуление контрольных бит вспомогательного массива
BinaryArray_2 = s.ToCharArray();
for (int i = 0; i < s.Length; i++)
{
if (i == (System.Math.Pow(2, st) - 1))
{
BinaryArray_2[i] = '0';
st++;
}
}
st = 0;
for (int i = 0; i < s.Length; i++)
{
if (i == (System.Math.Pow(2, st) - 1))
{
k_1 = 0;
ind_kb = i; // Индекс контрольного бита блока
len_kb = i + 1; // кол-во подчиненных контрольному биту бит в блоке
ind_kb_end = ind_kb + len_kb - 1; // Индекс конца блока
if (ind_kb_end > s.Length - 1) // Если индекс конца блока выходит за пределы длины строки, то присваиваем ему индекс последнего бита в строке
{
ind_kb_end = s.Length - 1;
}
for (int j = i; j < s.Length; j++) // Цикл от начала контрольного бита до конца строки
{
if ((j >= ind_kb) && (j <= ind_kb_end) && (BinaryArray_2[j] == '1')) // Если текущий индекс входит в блок и значение равно '1', то добавляем 1 в счетчик
{
k_1++;
}
if (j == ind_kb_end + 1) // Если текущий бит - следующий за концом очередного блока, то вычисляем индексы начала и конца следующего блока
{
ind_kb = ind_kb + 2 * len_kb;
ind_kb_end = ind_kb_end + 2 * len_kb;
}
}
if (k_1 % 2 == 1) // Если кол-во '1' нечетное, то в контрольный бит записываем '1'
{
BinaryArray_2[i] = '1';
}
else
{
BinaryArray_2[i] = '0';
}
if (BinaryArray[i] != BinaryArray_2[i]) // Если контрольные биты не совпадают, то добавляем к сумме индекс этого бита (причем не реальный индекс, который начинается с 0, а номер позиции, который будет на 1 больше индекса)
{
ssum = ssum + i + 1;
}
st++; // Добавляем 1 к значению степени
}
}
ssum--; // Получаем значение индекса бита с ошибкой, вычтя из суммы номеров позиций несовпавших контрольных бит 1
if (BinaryArray[ssum] == '1') // Инвертируем значение бита с ошибкой
{
BinaryArray[ssum] = '0';
}
else
{
BinaryArray[ssum] = '1';
}
pol_cod = new string(BinaryArray); // Преобразуем массив символов в строку
return pol_cod;
}
static string Unic_fix(string s)
{
string pol_cod = "";
char[] BinaryArray;
int st = 0;
BinaryArray = s.ToCharArray();
for (int i = 0; i < s.Length; i++)
{
if (i == (System.Math.Pow(2, st) - 1))
{
st++; // Если индекс текущего бита равен (2 в степени st - 1), то увеличиваем st на 1
}
else
{
pol_cod = pol_cod + BinaryArray[i]; // Если индекс текущего бита не равен (2 в степени st - 1), т.е. не является контрольным, то добавляем его в строку
}
}
return pol_cod;
}
static string Char_fix(string s)
{
string pol_cod = "";
string s1 = "";
string s2 = "";
s1 = s.Substring(0, s.Length / 2); // Разделяем исходную строку на две равные подстроки
s2 = s.Substring(s.Length / 2, s.Length / 2);
int i1 = Convert.ToInt32(s1, 2); // Получаем значение кода символа в Юникоде
int i2 = Convert.ToInt32(s2, 2);
pol_cod = pol_cod + (char)(i1); // Добавляем символ в выходную строку
pol_cod = pol_cod + (char)(i2);
return pol_cod;
}
}
}