@holymotion

Почему не правильно работает поиск символов в байтовой матрице?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication8
{
    class Program
    {
        static List<byte> URusa = new List<byte>(256);
        static List<byte> temp2 = new List<byte>(256);
        static byte[,] URusa2 = new byte[16, 16];

        static string crypt, decrypt, _temp;
        static int t, x1, x2, y1, y2;

        public static void SimbolPoc(char s, out int x, out int y)
        {
            x = 0;
            y = 0;

            for (var i = 0; i < 16; i++)
            {
                for (var j = 0; j < 16; j++)
                {
                    if (s == URusa2[i, j])
                    {
                        x = j; y = i;
                    }
                }
            }
        }

        public static string Playfair_crypt(string s, string key)
        {
            byte[] key2 = Encoding.GetEncoding(1251).GetBytes(key);

            byte k = 0;
            for (var i = 0; i <= 255; i++)
            {
                URusa.Add(k);
                k++;
            }
            /*********************************************************/
            for (var i = 0; i < key2.Length; i++)
            {
                if (!temp2.Contains(key2[i]))
                {
                    temp2.Add(key2[i]);
                }
            }
            for (var i = 0; i < URusa.Count; i++)
            {
                if (!temp2.Contains(URusa[i]))
                {
                    temp2.Add(URusa[i]);
                }
            }
            t = 0;
            for (var i = 0; i < 16; i++)
            {
                for (var j = 0; j < 16; j++)
                {
                    URusa2[i, j] = temp2[t];
                    t++;
                    Console.Write("{0} ", URusa2[i, j]);
                }
                Console.WriteLine();
            }
            //просмотр строки по парам символов и вставка разделяющего символа
            //"ъ" в случае когда в паре попались одинаковые символы.
            for (var i = 0; i < s.Length / 2; i++)
            {
                if (s[2 * i] == s[2 * i + 1])
                {
                    s = s.Insert(2 * i + 1, "ъ");
                }
            }

            if (s.Length % 2 == 1)
            {
                if (s[s.Length - 1] != 'ъ')
                    s = s + 'ъ';
                else
                    s = s + 'я';
            }

            _temp = "";

            //Применение правил для шифра Плейфейра
            for (var i = 0; i < s.Length / 2; i++)
            {
                SimbolPoc(s[2 * i], out x1, out y1);
                SimbolPoc(s[2 * i + 1], out x2, out y2);
                if (y1 == y2)
                {
                    x1++; x2++;
                    if (x1 >= 16) x1 = x1 - 16;
                    if (x2 >= 16) x2 = x2 - 16;
                    _temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
                }
                //Правило2
                if (x1 == x2)
                {
                    y1++;
                    y2++;
                    if (y1 >= 16) y1 = y1 - 16;
                    if (y2 >= 16) y2 = y2 - 16;
                    _temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
                }
                //Правило3
                if ((x1 != x2) && (y1 != y2)) _temp = _temp + URusa2[y1, x2] + URusa2[y2, x1];
            }
            crypt = _temp;
            return crypt;
        }
        public static string Playfair_decrypt(string s, string key)
        {
            byte[] key2 = Encoding.GetEncoding(1251).GetBytes(key);

            byte k = 0;
            for (var i = 0; i <= 255; i++)
            {
                URusa.Add(k);
                k++;
            }
            /*********************************************************/
            for (var i = 0; i < key2.Length; i++)
            {
                if (!temp2.Contains(key2[i]))
                {
                    temp2.Add(key2[i]);
                }
            }
            for (var i = 0; i < URusa.Count; i++)
            {
                if (!temp2.Contains(URusa[i]))
                {
                    temp2.Add(URusa[i]);
                }
            }
            t = 0;
            for (var i = 0; i < 16; i++)
            {
                for (var j = 0; j < 16; j++)
                {
                    URusa2[i, j] = temp2[t];
                    t++;
                }
            }
            //просмотр строки по парам символов и вставка разделяющего символа
            //"ъ" в случае когда в паре попались одинаковые символы.

            _temp = "";
            //Применение правил для шифра Плейфейра
            for (var i = 0; i < s.Length / 2; i++)
            {
                SimbolPoc(s[2 * i], out x1, out y1);
                SimbolPoc(s[2 * i + 1], out x2, out y2);
                if (y1 == y2)
                {
                    x1--;
                    x2--;
                    if (x1 < 0) x1 = x1 + 16;
                    if (x2 < 0) x2 = x2 + 16;
                    _temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
                }
                //Правило2
                if (x1 == x2)
                {
                    y1--;
                    y2--;
                    if (y1 < 0) y1 = y1 - 16;
                    if (y2 < 0) y2 = y2 - 16;
                    _temp = _temp + URusa2[y1, x1] + URusa2[y2, x2];
                }
                //Правило3
                if ((x1 != x2) && (y1 != y2)) _temp = _temp + URusa2[y1, x2] + URusa2[y2, x1];
            }
            decrypt = _temp;
            return decrypt;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(Playfair_crypt("Россия", "Форум"));
             //Console.WriteLine(Playfair_decrypt(Playfair_crypt("Россик", "Форум"), "Форум"));
        }
    }
}


Вообщем шифр Плейфейра. Суть задания: У меня есть - Ключ, Строка. Я создаю байтовый массив, записываю ключ в начало своего массива, и у меня получается байтовая матрица - это я сделал. Но когда нужно зашифровать, возникают проблемы, то есть запускается ф-я SimbolPoc(я передаю ей свой символ строки и х1,y1) - которая ищет символ в байтовой матрице и возвращает его номер строки и столбца, в случае если находит. И тут у меня вообще какая-то чепуха происходит с шифрованием, символ правильно не ищется, выдаёт всё время другое что-то.

Сам бади хелп ми плз!
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Отладчик в руки и вперед, смотреть что же именно у вас происходит.
Ответ написан
Комментировать
@ar4ebaldello
Если в вашей реализации SimbolPoc не находится символ, ты вы возвращаете индексы [0, 0], но это индекс первого элемента, а не признак отсутствия элемента. Предлагаю немного переосмыслить алгоритм и использовать более логичный метод TryGetCharIndices, который помимо индексов возвращает bool успеха поиска.
static bool TryGetCharIndices(char element, out int x, out int y)
{
    for (var i = 0; i < URusa2.GetLength(0); i++)
    {
        for (var j = 0; j < URusa2.GetLength(1); j++)
        {
            if (URusa2[i, j] == element)
            {
                y = i;
                x = j;
                return true;
            }
        }
    }

    x = -1;
    y = -1;
    return false;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы