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 }