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(); }
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 }