C # "Encoder" с помощью Stringbuilder - PullRequest
0 голосов
/ 24 ноября 2018

Я создаю программу, которая будет запрашивать строку, кодировать ее, отображать закодированный текст, а затем отображать декодированный текст.

Я создал массив символов из большинства символов клавиатуры и массив строк их значений.Например, буква A равна «1-», буква a равна «2-» и т. Д.

Вот что я пытался использовать:

protected internal static readonly char[] CHARS = {' ', 'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '.', '/', '<', '>', '?', ':', ';', '\'', '\"', '[', ']', '{', '}', '\\', '|', '`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+'};
protected internal static readonly string[] VALS = {"0-", "1-", "2-", "3-", "4-", "5-", "6-", "7-", "8-", "9-", "10-", "11-", "12-", "13-", "14-", "15-", "16-", "17-", "18-", "19-", "20-", "21-", "22-", "23-", "24-", "25-", "26-", "27-", "28-", "29-", "30-", "31-", "32-", "33-", "34-", "35-", "36-", "37-", "38-"};

    public static string Encode(string TextToEncode)
    {
        StringBuilder TTE = new StringBuilder(TextToEncode);

        #region Encode

        if (TTE.ToString().Contains(CHARS[0].ToString()) == true)
        {
            TTE.Replace(CHARS[0].ToString(), VALS[0]);
        }

        if (TTE.ToString().Contains(CHARS[1].ToString()) == true)
        {
            TTE.Replace(CHARS[1].ToString(), VALS[1]);
        }

        if (TTE.ToString().Contains(CHARS[2].ToString()) == true)
        {
            TTE.Replace(CHARS[2].ToString(), VALS[2]);
        }

        if (TTE.ToString().Contains(CHARS[3].ToString()) == true)
        {
            TTE.Replace(CHARS[3].ToString(), VALS[3]);
        }

        if (TTE.ToString().Contains(CHARS[4].ToString()) == true)
        {
            TTE.Replace(CHARS[4].ToString(), VALS[4]);
        }

        if (TTE.ToString().Contains(CHARS[5].ToString()) == true)
        {
            TTE.Replace(CHARS[5].ToString(), VALS[5]);
        }

        if (TTE.ToString().Contains(CHARS[6].ToString()) == true)
        {
            TTE.Replace(CHARS[6].ToString(), VALS[6]);
        }

        if (TTE.ToString().Contains(CHARS[7].ToString()) == true)
        {
            TTE.Replace(CHARS[7].ToString(), VALS[7]);
        }

        if (TTE.ToString().Contains(CHARS[8].ToString()) == true)
        {
            TTE.Replace(CHARS[8].ToString(), VALS[8]);
        }

        if (TTE.ToString().Contains(CHARS[9].ToString()) == true)
        {
            TTE.Replace(CHARS[9].ToString(), VALS[9]);
        }

        if (TTE.ToString().Contains(CHARS[10].ToString()) == true)
        {
            TTE.Replace(CHARS[10].ToString(), VALS[10]);
        }

        if (TTE.ToString().Contains(CHARS[11].ToString()) == true)
        {
            TTE.Replace(CHARS[11].ToString(), VALS[11]);
        }

        if (TTE.ToString().Contains(CHARS[12].ToString()) == true)
        {
            TTE.Replace(CHARS[12].ToString(), VALS[12]);
        }

        if (TTE.ToString().Contains(CHARS[13].ToString()) == true)
        {
            TTE.Replace(CHARS[13].ToString(), VALS[13]);
        }

        if (TTE.ToString().Contains(CHARS[14].ToString()) == true)
        {
            TTE.Replace(CHARS[14].ToString(), VALS[14]);
        }

        if (TTE.ToString().Contains(CHARS[15].ToString()) == true)
        {
            TTE.Replace(CHARS[15].ToString(), VALS[15]);
        }

        if (TTE.ToString().Contains(CHARS[16].ToString()) == true)
        {
            TTE.Replace(CHARS[16].ToString(), VALS[16]);
        }

        if (TTE.ToString().Contains(CHARS[17].ToString()) == true)
        {
            TTE.Replace(CHARS[17].ToString(), VALS[17]);
        }

        if (TTE.ToString().Contains(CHARS[18].ToString()) == true)
        {
            TTE.Replace(CHARS[18].ToString(), VALS[18]);
        }

        if (TTE.ToString().Contains(CHARS[19].ToString()) == true)
        {
            TTE.Replace(CHARS[19].ToString(), VALS[19]);
        }

        if (TTE.ToString().Contains(CHARS[20].ToString()) == true)
        {
            TTE.Replace(CHARS[20].ToString(), VALS[20]);
        }

        #endregion

        return TTE.ToString();
    }

Метод декодирования:

public static string Decode(string EncodedText)
    {
        StringBuilder TTD = new StringBuilder(EncodedText);

        #region Decode

        if (TTD.ToString().Contains(VALS[0]) == true) // [space]
        {
            TTD.Replace(VALS[0], CHARS[0].ToString());
        }

        if (TTD.ToString().Contains(VALS[1]) == true) // A
        {
            TTD.Replace(VALS[1], CHARS[1].ToString());
        }

        if (TTD.ToString().Contains(VALS[2]) == true) // a
        {
            TTD.Replace(VALS[2], CHARS[2].ToString());
        }

        if (TTD.ToString().Contains(VALS[3]) == true) // B
        {
            TTD.Replace(VALS[3], CHARS[3].ToString());
        }

        if (TTD.ToString().Contains(VALS[4]) == true) // b
        {
            TTD.Replace(VALS[4], CHARS[4].ToString());
        }

        if (TTD.ToString().Contains(VALS[5]) == true) // C
        {
            TTD.Replace(VALS[5], CHARS[5].ToString());
        }

        if (TTD.ToString().Contains(VALS[6]) == true) // c
        {
            TTD.Replace(VALS[6], CHARS[6].ToString());
        }

        if (TTD.ToString().Contains(VALS[7]) == true) // D
        {
            TTD.Replace(VALS[7], CHARS[7].ToString());
        }

        if (TTD.ToString().Contains(VALS[8]) == true) // d
        {
            TTD.Replace(VALS[8], CHARS[8].ToString());
        }

        if (TTD.ToString().Contains(VALS[9]) == true) // E
        {
            TTD.Replace(VALS[9], CHARS[9].ToString());
        }

        if (TTD.ToString().Contains(VALS[10]) == true) // e
        {
            TTD.Replace(VALS[10], CHARS[10].ToString());
        }

        if (TTD.ToString().Contains(VALS[11]) == true) // F
        {
            TTD.Replace(VALS[11], CHARS[11].ToString());
        }

        if (TTD.ToString().Contains(VALS[12]) == true) // f
        {
            TTD.Replace(VALS[12], CHARS[12].ToString());
        }

        if (TTD.ToString().Contains(VALS[13]) == true) // G
        {
            TTD.Replace(VALS[13], CHARS[13].ToString());
        }

        if (TTD.ToString().Contains(VALS[14]) == true) // g
        {
            TTD.Replace(VALS[14], CHARS[14].ToString());
        }

        if (TTD.ToString().Contains(VALS[15]) == true) // H
        {
            TTD.Replace(VALS[15], CHARS[15].ToString());
        }

        if (TTD.ToString().Contains(VALS[16]) == true) // h
        {
            TTD.Replace(VALS[16], CHARS[16].ToString());
        }

        if (TTD.ToString().Contains(VALS[17]) == true) // I
        {
            TTD.Replace(VALS[17], CHARS[17].ToString());
        }

        if (TTD.ToString().Contains(VALS[18]) == true) // i
        {
            TTD.Replace(VALS[18], CHARS[18].ToString());
        }

        if (TTD.ToString().Contains(VALS[19]) == true) // J
        {
            TTD.Replace(VALS[19], CHARS[19].ToString());
        }

        if (TTD.ToString().Contains(VALS[20]) == true) // j
        {
            TTD.Replace(VALS[20], CHARS[20].ToString());
        }

        #endregion

        return TTD.ToString();
    }

Кодирующая часть программы работает нормально, а декодирование - нет.Он работает до тех пор, пока не доберется до оператора if, который преобразует строчную букву e (рядом с кодом «// e»).Когда кодируется, выход «10-».но когда он пытается декодировать «10-», вместо буквы e он выводит число 1. Похоже, что декодер не получает все «10-», только первый символ.

Любые предложения о том, как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Проблема с вашим кодом заключается в том, что вы выполняете полную замену типа TTE.Replace(CHARS[0].ToString(), VALS[0]), которая вызывает у вас горе, если вы уже произвели замену, которая привела к неоднозначному символу.

Например, если выЕсли у вас есть строка " 0", вы сначала замените " " на "0-", что даст вам "0-0", затем вы замените два "0" на "53-", что приведет к "53--53-" с последующей заменой "3" с "56-", дающим "556---556--" и т. д. Итак, наконец, после всех замен строка " 0" станет "56191-91-56191-91-56291-91-91-91-91-56191-91-56191-91-56291-91-91-91-".

Что вам нужно сделать, это перебрать текст для преобразованияи просто сопоставьте каждого персонажа один раз.Вот как:

protected internal static readonly char[] CHARS = " AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789,./<>?:;\'\"[]{}\\|`~!@#$%^&*()-_=+".ToCharArray();

public static string Encode(string textToEncode)
{
    var map = CHARS.Select((c, n) => new { c, v = $"{n}-" }).ToDictionary(x => x.c, x => x.v);
    return String.Join("", textToEncode.Select(x => map[x]));
}

Это правильно отобразит " 0" на "0-53-".

Теперь обратное почти так же просто.Поскольку кодирование вводит -, легко просто разделить закодированную строку на - и затем отобразить из числового числа.

public static string Decode(string textToDecode)
{
    var map = CHARS.Select((c, n) => new { c, v = $"{n}-" }).ToDictionary(x => x.v, x => x.c);
    return String.Join("", textToDecode.Split(new [] { '-' }, StringSplitOptions.RemoveEmptyEntries).Select(x => map[$"{x}-"]));
}

Если я добавлю "0-53-" в качестве источника, я получаю" 0" как и ожидалось.

0 голосов
/ 24 ноября 2018

Ваша проблема в том, что некоторые «закодированные» символы будут обработаны до того, как будет выполнено полное «кодирование», как вы его написали.

Например,

"20-20-10-11 - "

будет прогрессировать в вашем декодировании как:

" 2 2 1 1A "

Поэтому ваш двойникЦифровое кодирование не будет обрабатываться должным образом.

Чтобы правильно решить эту проблему, используя вашу текущую методологию, вам нужно будет поставить начальную черту в ваших совпадениях.

"- 10-" соответствует вашему "e"заменить на" -е ".То же самое для всех, за исключением первого, который должен совпадать последним в наборе, например, если это «3-02-», последним будет соответствовать ПЕРВЫЙ «3-» без начального символа тире «-» после всехдругие были обработаны.

Другими словами, обходите строку, используя начальную черту в каждой кодировке, затем выполняйте еще один проход без ведущей черты.

Обратите внимание, что у вас также возникнет проблема сваш символ "-" - он не будет совпадать, как и все ваши числовые "символы" во время процесса декодирования, из-за чего возникнут другие проблемы.

...