Ejemplo n.º 1
0
        private bool TryDecode(string full_bin_list)
        {
            BinaryBox1.Clear();
            BinaryBox2.Clear();
            PatterBox.Clear();
            number_type[] n_type_array = new number_type[12];
            for (int i = 0; i < 12; i++)
            {
                if (!encoding_table.TryGetValue(full_bin_list.Substring(i * 7, 7), out n_type_array[i]))
                {
                    label1.Text = "Error. There is no such bit patter in encoding table";
                    return(false);
                }
                if (i < 6)
                {
                    BinaryBox1.Text += full_bin_list.Substring(i * 7, 7) + " ";
                }
                else
                {
                    BinaryBox2.Text += full_bin_list.Substring(i * 7, 7) + " ";
                }
            }

            string encoded_type_str = "";

            for (int i = 0; i < 6; i++)
            {
                encoded_type_str += n_type_array[i].type.ToString();
            }
            for (int i = 0; i < 12; i++)
            {
                PatterBox.Text += n_type_array[i].type.ToString();
            }

            int first_number = -1;

            for (int i = 0; i < 10; i++)
            {
                if (first_number_code[i] == encoded_type_str)
                {
                    first_number = i;
                    break;
                }
            }
            if (first_number == -1)
            {
                label1.Text = "Error. First number wasn't recognized";
                return(false);
            }

            string fullEAN = first_number.ToString();

            for (int i = 0; i < 12; i++)
            {
                fullEAN += n_type_array[i].number.ToString();
            }

            DigitBox.Text = fullEAN;

            if (get_control_sum(fullEAN) != int.Parse(fullEAN[12].ToString()))
            {
                label1.Text = "Error. Checksum is wrong";
                return(false);
            }
            return(true);
        }
Ejemplo n.º 2
0
        private void DecodeBtn_Click(object sender, EventArgs e)
        {
            if (Img == null)
            {
                return;
            }
            List <List <int> > bb = new List <List <int> >();

            for (int yi = 0; yi < Img.Height; yi++)
            {
                List <int> a  = new List <int>();
                int        b  = 1;
                bool       bc = IsBlack(Img.GetPixel(0, yi));
                for (int xi = 1; xi < Img.Width; xi++)
                {
                    bool bc2 = IsBlack(Img.GetPixel(xi, yi));
                    if (bc2 != bc)
                    {
                        a.Add(b);
                        b = 0;
                    }
                    bc = bc2;
                    b++;
                }
                bb.Add(a);
            }

            int[] cc = new int[255];
            for (int i = 0; i < bb.Count; i++)
            {
                if (bb[i].Count < 255)
                {
                    cc[bb[i].Count]++;
                }
            }
            int b_num = 0;

            for (int i = 5; i < 255; i++)
            {
                if (cc[i] > b_num)
                {
                    b_num = i;
                }
            }
            for (int i = 0; i < bb.Count; i++)
            {
                if (bb[i].Count != b_num)
                {
                    bb.RemoveAt(i);
                    i--;
                }
            }
            double b_len = 0;

            foreach (List <int> a in bb)
            {
                b_len += a[1] + a[3] + a[a.Count - 2] + a[a.Count - 4];
            }
            b_len /= 4 * bb.Count;
            b_len *= 0.88;     // це або баг або фіча,
            //довжина перших і останніх базових довжин стрічок трохи більша ніж треба

            double w_len = 0;

            foreach (List <int> a in bb)
            {
                w_len += a[2] + a[a.Count - 3];
            }
            w_len /= 2 * bb.Count;

            int    bb_inner_length = bb[0].Count;
            string full_bin_list   = "";

            for (int i = 4; i <= bb_inner_length - 4; i++)
            {
                int cur_sum = 0;
                foreach (List <int> cur_line in bb)
                {
                    cur_sum += cur_line[i];
                }
                int int_bits_amount = 0;

                double average_length = (double)cur_sum / bb.Count;
                if (i % 2 == 0)
                {
                    double bit_amount = average_length / w_len;
                    int_bits_amount = (int)Math.Round(bit_amount);
                    for (int j = 0; j < int_bits_amount; j++)
                    {
                        full_bin_list += "0";
                    }
                }
                else
                {
                    double bit_amount = average_length / b_len;
                    int_bits_amount = (int)Math.Round(bit_amount);
                    for (int j = 0; j < int_bits_amount; j++)
                    {
                        full_bin_list += "1";
                    }
                }
            }
            full_bin_list = full_bin_list.Substring(0, 42) + full_bin_list.Substring(47, 42); //     Видалємо середні допоміжні біти


            number_type[] n_type_array = new number_type[12];
            label1.Text      = "Успешно декодирован";
            label1.ForeColor = Color.Green;
            if (!TryDecode(full_bin_list, n_type_array))
            {
                number_type[] n_type_array2 = new number_type[12];
                for (int i = 0; i < 12; i++)
                {
                    n_type_array2[11 - i] = n_type_array[i];
                }
                n_type_array = n_type_array2;
                if (!TryDecode(full_bin_list, n_type_array))
                {
                    label1.ForeColor = Color.Red;
                }
            }
        }
Ejemplo n.º 3
0
        private void DecodeBtn_Click(object sender, EventArgs e)
        {
            if (Img == null) return;
            List<List<int>> bb = new List<List<int>>();
            for (int yi = 0; yi < Img.Height; yi++)
            {
                List<int> a = new List<int>();
                int b = 1;
                bool bc = IsBlack(Img.GetPixel(0, yi));
                for (int xi = 1; xi < Img.Width; xi++)
                {
                    bool bc2 = IsBlack(Img.GetPixel(xi, yi));
                    if (bc2 != bc)
                    {
                        a.Add(b);
                        b = 0;
                    }
                    bc = bc2;
                    b++;
                }
                bb.Add(a);
            }

            int[] cc = new int[255];
            for (int i = 0; i < bb.Count; i++)
            {
                if (bb[i].Count < 255)
                    cc[bb[i].Count]++;
            }
            int b_num = 0;
            for (int i = 5; i < 255; i++)
            {
                if (cc[i] > b_num) b_num = i;
            }
            for (int i = 0; i < bb.Count; i++)
            {
                if (bb[i].Count != b_num)
                {
                    bb.RemoveAt(i);
                    i--;
                }
            }
            double b_len = 0;
            foreach (List<int> a in bb)
            {
                b_len += a[1] + a[3] + a[a.Count - 2] + a[a.Count - 4];
            }
            b_len /= 4 * bb.Count;
            b_len *= 0.88;     // це або баг або фіча,
            //довжина перших і останніх базових довжин стрічок трохи більша ніж треба

            double w_len = 0;
            foreach (List<int> a in bb)
            {
                w_len += a[2] + a[a.Count - 3];
            }
            w_len /= 2 * bb.Count;

            int bb_inner_length = bb[0].Count;
            string full_bin_list = "";
            for (int i = 4; i <= bb_inner_length - 4; i++)
            {
                int cur_sum = 0;
                foreach (List<int> cur_line in bb)
                {
                    cur_sum += cur_line[i];
                }
                int int_bits_amount = 0;

                double average_length = (double)cur_sum / bb.Count;
                if (i % 2 == 0)
                {
                    double bit_amount = average_length / w_len;
                    int_bits_amount = (int)Math.Round(bit_amount);
                    for (int j = 0; j < int_bits_amount; j++)
                    {
                        full_bin_list += "0";
                    }
                }
                else
                {
                    double bit_amount = average_length / b_len;
                    int_bits_amount = (int)Math.Round(bit_amount);
                    for (int j = 0; j < int_bits_amount; j++)
                    {
                        full_bin_list += "1";
                    }
                }
            }
            full_bin_list = full_bin_list.Substring(0, 42) + full_bin_list.Substring(47, 42); //     Видалємо середні допоміжні біти

            number_type[] n_type_array = new number_type[12];
            label1.Text = "Успешно декодирован";
            label1.ForeColor = Color.Green;
            if (!TryDecode(full_bin_list, n_type_array))
            {
                number_type[] n_type_array2 = new number_type[12];
                for (int i = 0; i < 12; i++)
                {
                    n_type_array2[11 - i] = n_type_array[i];
                }
                n_type_array = n_type_array2;
                if (!TryDecode(full_bin_list, n_type_array))
                {
                    label1.ForeColor = Color.Red;
                }
            }
        }
Ejemplo n.º 4
0
        private bool TryDecode(string full_bin_list)
        {
            BinaryBox1.Clear();
            BinaryBox2.Clear();
            PatterBox.Clear();
            number_type[] n_type_array = new number_type[12];
            for (int i = 0; i < 12; i++)
            {
                if (!encoding_table.TryGetValue(full_bin_list.Substring(i * 7, 7), out n_type_array[i]))
                {
                    label1.Text = "Error. There is no such bit patter in encoding table";
                    return false;
                }
                if (i < 6)
                    BinaryBox1.Text += full_bin_list.Substring(i * 7, 7) + " ";
                else
                    BinaryBox2.Text += full_bin_list.Substring(i * 7, 7) + " ";
            }

            string encoded_type_str = "";
            for (int i = 0; i < 6; i++)
            {
                encoded_type_str += n_type_array[i].type.ToString();
            }
            for (int i = 0; i < 12; i++)
            {
                PatterBox.Text += n_type_array[i].type.ToString();
            }

            int first_number = -1;
            for (int i = 0; i < 10; i++)
            {
                if (first_number_code[i] == encoded_type_str)
                {
                    first_number = i;
                    break;
                }
            }
            if (first_number == -1)
            {
                label1.Text = "Error. First number wasn't recognized";
                return false;
            }

            string fullEAN = first_number.ToString();
            for (int i = 0; i < 12; i++)
            {
                fullEAN += n_type_array[i].number.ToString();
            }

            DigitBox.Text = fullEAN;

            if (get_control_sum(fullEAN) != int.Parse(fullEAN[12].ToString()))
            {
                label1.Text = "Error. Checksum is wrong";
                return false;
            }
            return true;
        }
Ejemplo n.º 5
0
        private bool TryDecode(string full_bin_list, number_type[] n_type_array)
        {
            BinaryBox.Clear();
            PatterBox.Clear();
            for (int i = 0; i < 12; i++)
            {
                if (!encoding_table.TryGetValue(full_bin_list.Substring(i * 7, 7), out n_type_array[i]))
                {
                    label1.Text = "Error. There is no such bit patter in encoding table";
                    return false;
                }
                BinaryBox.Text += full_bin_list.Substring(i * 7, 7) + " ";
            }

            string encoded_type_str = "";
            for (int i = 0; i < 6; i++)
            {
                encoded_type_str += n_type_array[i].type.ToString();
            }
            for (int i = 0; i < 12; i++)
            {
                PatterBox.Text += n_type_array[i].type.ToString();
            }

            int first_number = -1;
            for (int i = 0; i < 10; i++)
            {
                if (first_number_code[i] == encoded_type_str)
                {
                    first_number = i;
                    break;
                }
            }
            if (first_number == -1)
            {
                label1.Text = "Error. First number wasn't recognized";
                return false;
            }

            string fullEAN = first_number.ToString();
            for (int i = 0; i < 12; i++)
            {
                fullEAN += n_type_array[i].number.ToString();
            }

            DigitBox.Text = fullEAN;

            int[] fullIntEAN = new int[13];
            fullIntEAN[0] = first_number;
            for (int i = 0; i < 12; i++)
            {
                fullIntEAN[i + 1] = n_type_array[i].number;
            }
            if (!checkCode(fullIntEAN))
            {
                label1.Text = "Error. Checksum is wrong";
                return false;
            }
            return true;
        }