Beispiel #1
0
 //сложение по модулю 2 двух битовых последовательностей
 //размер конечно должен быть одинаковый
 public int[] xorVectVect(int[] a, int[] b)
 {
     if (a == null)
     {
         Console.WriteLine("PANIC! <xorVectVect(a,b)> input parameter a is null");
         return(null);
     }
     if (b == null)
     {
         Console.WriteLine("PANIC! <xorVectVect(a,b)> input parameter b is null");
         return(null);
     }
     if (a.Length != b.Length)
     {
         return(null);
     }
     int[] sum = new int[a.Length];
     for (int i = 0; i < a.Length; i++)
     {
         if (Hem.isEven(a[i] + b[i]))
         {
             sum[i] = 0;
         }
         else
         {
             sum[i] = 1;
         }
     }
     return(sum);
 }
Beispiel #2
0
        static void Main(string[] args)
        {
            Console.WriteLine("hem encode start");

            Console.Write("введите сигнал:\t\t");
            string inputMsg = Console.ReadLine();
            //string inputMsg = "101";
            int n = inputMsg.Length;

            if ((n < 2) || (n > 10))
            {
                Console.WriteLine("количесво бит в сообщении должно быть от 3 до 10.");
                Environment.Exit(0);
            }
            // объект класса Hem обеспечивает кодирование/декодирование, проверку сообщений
            // в нём хранятся матрицы соответствующие данной длине сообщения
            Hem hem = new Hem(n);

            if (hem.k < 0)
            {
                Console.WriteLine("количество бит во входном сигнале больше допустимого, количество бит должно быть от 3 до 10");
            }
            //отладочный вывод матриц
            {
                /*Console.WriteLine("G");
                 * hem.PrintG();
                 * Console.WriteLine("H");
                 * hem.PrintH();
                 * Console.WriteLine("Ht");
                 * hem.PrintHt();*/
            }
            int[] a = Hem.StrToBits(inputMsg);
            int[] b = hem.encode(a);
            Console.WriteLine("закодированный сигнал:\t" + Hem.BitsToStr(b));
            Console.Write("исправьте сигнал:\t");
            b = Hem.StrToBits(Console.ReadLine());
            //b = Hem.StrToBits("001101");

            //sindrom() возвращает битовый массив ошибки
            //результат нужно проверять на null - это признак внутренней ошибки
            int[] sind = hem.sindrom(b);
            Console.WriteLine("синдром:\t\t" + Hem.BitsToStr(sind));
            int e = Hem.BitsToInt(sind);

            if (e == 0)
            {
                Console.WriteLine("ошибка отсутствует:\t" + e);
            }
            else
            {
                //если ошибка есть, то надо ковырять
                //ищем в генерирующей таблице G строку в которой контрольные биты совпадают с синдромом
                e = hem.errorPos(sind);
                if (e >= 0)
                {
                    Console.WriteLine("позиция ошибки:\t\t" + e);
                    b = hem.fix(b, e);
                }
                else
                {
                    Console.WriteLine("сигнал получен верный, ошибочно передан один из битов коррекции");
                }
            }
            int[] B = hem.signal(b);
            Console.WriteLine("правильный сигнал:\t" + Hem.BitsToStr(B));
        }