Exemplo n.º 1
0
        static void TinhCK_Ghep(string Sf, int k, int Ntt, ref long Ts)
        {
            StreamReader F_In;
            StreamWriter F_O;
            string       Ss1, Ss2, Ss3, S, S1, S2, S3, S4, S5;
            int          j, L1;
            bool         Tiep;

            Ss1 = "" + (k - 1);
            Ss2 = "" + Ntt;
            Ss3 = "" + k;

            F_In = new StreamReader(@"TTX_" + Sf + "_" + Ss1 + "_" + Ss2 + ".Txt");
            F_O  = new StreamWriter(@"TKN_" + Sf + "_" + Ss3 + "_" + Ss2 + ".Txt", false);

            L1 = 0;
            Ts = 0;
            Console.WriteLine("\t ♦ Dang ghep cac tap thuong xuyen ", k - 1, " muc du lieu");

            while ((S1 = F_In.ReadLine()) != null)
            {
                S2 = S1;
                S3 = "";
                for (j = 1; j <= k - 2; j++)
                {
                    S3 = S3 + S2.Substring(0, S2.IndexOf(";") + 1);

                    S2 = S2.Remove(0, S2.IndexOf(";") + 1);
                }
                Tiep = !F_In.EndOfStream;
                while ((!F_In.EndOfStream) && Tiep)
                {
                    S4 = F_In.ReadLine();
                    S5 = "";
                    for (j = 1; j <= k - 2; j++)
                    {
                        S5 = S5 + S4.Substring(0, S4.IndexOf(";") + 1);
                        S4 = S4.Remove(0, S4.IndexOf(";") + 1);
                    }
                    if (S3 == S5)
                    {
                        Ts = Ts + 1;
                        F_O.WriteLine(S1 + S4);
                        Tiep = true;
                        if (Ts % 1000 == 0)
                        {
                            Console.Write(Ts + "\t");
                        }
                    }
                    else
                    {
                        Tiep = false;
                    }
                }
                F_In.BaseStream.Seek(0, SeekOrigin.Begin);
                L1 = L1 + 1;
                for (j = 1; j <= L1; j++)
                {
                    S = F_In.ReadLine();
                }
            }
            F_Ketqua.WriteLine("Co " + Ts + " tap " + k + " muc du lieu duoc ghep");
            F_In.Close();
            F_O.Close();
        }
Exemplo n.º 2
0
        public virtual void Coding()
        {
            #region
            string primer = "";

            primer = S;
            primer = primer.Insert(0, "X").Insert(1, "X");

            Sk     = S;                               // для вывода
            S      = S.Insert(0, "0").Insert(1, "0"); // вставка нулей в 0, 2^0
            NumBit = 2;                               //отсчет начинается с двух, так как первый два бита мы уже добавили

            for (int i = 4, j = 3; i < S.Length; i = (int)Math.Pow(2, j), j++)
            {
                NumBit++;
                S      = S.Insert(i - 1, "0");
                primer = primer.Insert(i - 1, "X");
            }
            listBox1.Items.Add("Кол-во контрольных бит:  " + NumBit);
            listBox1.Items.Add("-----------------------------");
            listBox1.Items.Add("До вычисления самих контрольных бит, мы присвоили им значение ноль : " + S);
            listBox1.Items.Add("-----------------------------");
            listBox1.Items.Add("Х - места куда мы подставляем проверочные биты :  " + primer);
            listBox1.Items.Add("-----------------------------");
            listBox1.Items.Add("         Матрица");

            string[] tem = new string[NumBit];
            int      x   = S.Length;

            //Строим подобие матрицы,зависящее от количества контрольных бит
            // Контрольные биты , которые контролирует другие биты помечаються 1 , которые не контролируються 0
            // Первая строчка  отвечает за 1,3,5,7,9 и так далее бит тоесть через один
            for (int i = 0; i < S.Length / 2; i++)
            {
                S1 += "0";
            }
            for (int i = 0; i < S.Length; i = i + 2)
            {
                S1 = S1.Insert(i, "1");
            }
            listBox1.Items.Add(S1);
            //Если контрольных бит >= 1 то вторая строчка отвечает за 2,3 6,7 тоесть через за 2 через два начиная со 2рого бита
            if (NumBit >= 1)
            {
                for (int i = 0; i < S.Length / 2; i++)
                {
                    S2 += "0";
                }
                for (int i = 1; i < S.Length; i = i + 4)
                {
                    S2 = S2.Insert(i, "11");
                }
                if (S2.Length > S1.Length)
                {
                    S2 = S2.Remove(S2.Length - 1);
                }
                else if (S2.Length < S1.Length)
                {
                    S2 += "0";
                }
                listBox1.Items.Add(S2);
            }
            //Если контрольных бит >= 3 то вторая строчка отвечает за 4.5.6.7 тоесть за 4 бита через 4 бита
            if (NumBit >= 3)         // это костыль костылей :)
            {
                S3 = S;
                S3 = S3.Replace('1', '0');

                for (int i = 3; i < S.Length; i = i + 8)
                {
                    S3 = S3.Insert(i, "1111");
                }
                if (S3.Length > S2.Length)
                {
                    int raznica = S3.Length - S2.Length;
                    S3 = S3.Remove(S3.Length - raznica);
                }
                listBox1.Items.Add(S3);
            }
            // За 8 бит , через 8
            if (NumBit >= 4)         // это костыль костылей :)
            {
                S4 = S;
                S4 = S4.Replace('1', '0');

                for (int i = 7; i < S.Length; i = i + 16)
                {
                    S4 = S4.Insert(i, "11111111");
                }
                if (S4.Length > S3.Length)
                {
                    int raznica = S4.Length - S3.Length;
                    S4 = S4.Remove(S4.Length - raznica);
                }
                listBox1.Items.Add(S4);
            }

            if (NumBit >= 5)         // это костыль костылей :)
            {
                S5 = S;
                S5 = S5.Replace('1', '0');

                for (int i = 15; i < S.Length; i = i + 32)
                {
                    S5 = S5.Insert(i, "1111111111111111");
                }
                if (S5.Length > S4.Length)
                {
                    int raznica = S5.Length - S4.Length;
                    S5 = S5.Remove(S5.Length - raznica);
                }
                listBox1.Items.Add(S5);
            }

            // ---------- Вычисление контрольных бит ----------
            //берём каждый контрольный бит и смотрим сколько среди контролируемых им битов единиц,
            //получаем некоторое целое число и, если оно чётное, то ставим ноль,
            //в противном случае ставим единицу.

            // заносим в масивы числа из строчек
            int[] sBoss = S.Select(ch => int.Parse(ch.ToString())).ToArray();         //массив из целых чисел


            // заносим в масивы числа из строчек
            if (NumBit > 0)
            {
                sBoss1 = S1.Select(ch => int.Parse(ch.ToString())).ToArray();
            }
            if (NumBit >= 1)
            {
                sBoss2 = S2.Select(ch => int.Parse(ch.ToString())).ToArray();
            }
            if (NumBit >= 3)
            {
                sBoss3 = S3.Select(ch => int.Parse(ch.ToString())).ToArray();
            }
            if (NumBit >= 4)
            {
                sBoss4 = S4.Select(ch => int.Parse(ch.ToString())).ToArray();
            }
            if (NumBit >= 5)
            {
                sBoss5 = S5.Select(ch => int.Parse(ch.ToString())).ToArray();
            }

            listBox1.Items.Add("-----------------------------");
            listBox1.Items.Add("       Контрольные биты");

            // читать описание выше что тут происходит
            int temp = 0;
            for (int i = 0; i < S.Length; i++)
            {
                temp += sBoss[i] * sBoss1[i];         //массив с изначальными значениями и массив 1ой строчки в матрице
            }
            if (temp > 1)
            {
                tem[0] = Convert.ToString(temp % 2);
            }
            else
            {
                tem[0] = Convert.ToString(temp);
            }
            listBox1.Items.Add("r1 =  " + tem[0]);       // первый проверочный бит
                                                         //дальше по анологии
            int temp2 = 0;
            if (NumBit >= 1)
            {
                for (int i = 0; i < S.Length; i++)
                {
                    temp2 += sBoss[i] * sBoss2[i];
                }
                if (temp2 > 1)
                {
                    tem[1] = Convert.ToString(temp2 % 2);
                }
                else
                {
                    tem[1] = Convert.ToString(temp2);
                }
                listBox1.Items.Add("r2 =  " + tem[1]);
            }

            int temp3 = 0;
            if (NumBit >= 3)
            {
                for (int i = 0; i < S.Length; i++)
                {
                    temp3 += sBoss[i] * sBoss3[i];
                }
                if (temp3 > 1)
                {
                    tem[2] = Convert.ToString(temp3 % 2);
                }
                else
                {
                    tem[2] = Convert.ToString(temp3);
                }
                listBox1.Items.Add("r3 =  " + tem[2]);
            }

            int temp4 = 0;
            if (NumBit >= 4)
            {
                for (int i = 0; i < S.Length; i++)
                {
                    temp4 += sBoss[i] * sBoss4[i];
                }
                if (temp4 > 1)
                {
                    tem[3] = Convert.ToString(temp4 % 2);
                }
                else
                {
                    tem[3] = Convert.ToString(temp4);
                }
                listBox1.Items.Add("r4 =  " + tem[3]);
            }

            int temp5 = 0;
            if (NumBit >= 5)
            {
                for (int i = 0; i < S.Length; i++)
                {
                    temp5 += sBoss[i] * sBoss5[i];
                }
                if (temp5 > 1)
                {
                    tem[4] = Convert.ToString(temp5 % 2);
                }
                else
                {
                    tem[4] = Convert.ToString(temp5);
                }
                listBox1.Items.Add("r5 =  " + tem[4]);
            }

            //подставляем получиные значения в контрольные биты
            for (int i = 1, j = 1, k = 0; i < Sk.Length; i = (int)Math.Pow(2, j), j++, k++)
            {
                Sk = Sk.Insert(i - 1, tem[k]);
            }
            listBox1.Items.Add("-----------------------------");
            listBox1.Items.Add("Полученная последовательность вычисление контрольных бит");
            listBox1.Items.Add(Sk);
            #endregion
        }