Мне нужна помощь в работе сформатировать словари в C # - PullRequest
0 голосов
/ 06 декабря 2018

Это сообщение о трудностях, с которыми я сталкиваюсь в C # (приложение Windows Forms в Visual Studio 2017, .NET Framework) в отношении использования словаря в формате "string, char".

Здесьвот что у меня есть:

Первый - словарь в формате

Dictionary<String, char> bintoascii = new Dictionary<String, char>()
{
    { "01000001" , 'A'},
    { "01000010" , 'B'},
    //..................
    { "01111010" , 'z'},
    { "00100000" , ' ' },
};

И фактический код преобразования:

AsciiOutput.Text = "";

String binninput = Input.Text;

for (int i = 0; i < binninput.Length; i++)
{
    if (i > 0)
        AsciiOutput.Text = AsciiOutput.Text + " ";
    else if (i == 0)
    {
        AsciiOutput.Text = AsciiOutput.Text + " ";
    }

    string b = binninput[i].ToString();

    if (bintoascii.ContainsKey(b))
        AsciiOutput.Text = AsciiOutput.Text + (bintoascii[b]);
}

Функция этого кода - преобразоватьиз двоичного в ASCII через входные и выходные текстовые поля (которые уже были успешно установлены в моем графическом интерфейсе).

По сути, он сначала объявляет словарь двоичных значений (представленных в виде строк) и соответствующие им значения ASCII (представленныекак символы).

Текстовое поле, в которое вводится двоичный файл, является Input.Text, а текстовое поле, из которого выводится ASCII, является AsciiOutput.Text (Примечание: строка binninput представляет Input.Text)

Существует цикл, основанный на длине Input (binninput / Input.Text), который помещает пробелы между каждой буквой двоичного файла.Так, например, это будет 01000001 01000010 вместо 0100000101000010.

Последняя часть цикла вставляет 8-значное двоичное представление каждой буквы отдельно (следовательно, почему оно повторяется в зависимости от длины ввода).

Visual Studio не отображает ошибок, но текстовое поле вывода (AsciiOutput.Text) пусто в моем графическом интерфейсе.Я не уверен в этом, но я думаю, что проблема заключается в строке кода

string b = binninput[i].ToString();

.Удаление функции .ToString () приводит к ошибкам преобразования.Я часами пытался возиться с заменой символов, целых и строк, думая, что это основная ошибка, но без решения, поэтому я и пришел сюда.

(Используя словарь в формате char, string, я получил ASCIIк бинарным преобразованиям работает отлично, и код выглядит очень похоже; если кто-то захочет, я тоже могу опубликовать это здесь)

1 Ответ

0 голосов
/ 06 декабря 2018

Похоже, вы пытаетесь найти Key (двоичную строку) из заданного Value (символа из некоторой входной строки).

Один из способов сделатьдля этого нужно использовать System.Linq метод расширения FirstOrDefault (который возвращает первое совпадение или значение по умолчанию для типа, если совпадение не найдено), использовать Value == character в качестве критерия совпадения и получить Key из результата:

// This would return "01000001" in your example above
var result = bintoascii.FirstOrDefault(x => x.Value == 'A').Key;

Вот пример краткого кода, который заполняет словарь строковым представлением двоичных значений для символов, представляющих все цифры, прописные и строчные буквы, и пробел, а затем анализирует входную строку("Hello @ World") и возвращает Key для каждого символа, найденного в Value в словаре (если значение отсутствует, то он отображает символ в квадратных скобках - я добавил символ '@' в тестовую строкучтобы показать, как это будет выглядеть):

static void Main(string[] args)
{
    // Populate dictionary with string binary key and associated char value
    Dictionary<String, char> binToAscii =
        Enumerable.Range(32, 1)               // Space character
            .Concat(Enumerable.Range(48, 10)) // Numbers
            .Concat(Enumerable.Range(65, 26)) // Uppercase Letters
            .Concat(Enumerable.Range(97, 26)) // Lowercase Letters
            .Select(intVal => (char) intVal)  // Convert int to char
            // And finally, set the key to the binary string, padded to 8 characters
            .ToDictionary(dataChar => Convert.ToString(dataChar, 2).PadLeft(8, '0'));

    var testString = "Hello @ World";

    // Display the binary representation of each character or [--char--] if missing
    var resultString = string.Join(" ", testString.Select(chr =>
        binToAscii.FirstOrDefault(x => x.Value == chr).Key ?? $"[--'{chr}'--]"));

    Console.WriteLine($"{testString} ==\n{resultString}");

    GetKeyFromUser("\nDone! Press any key to exit...");
}

Вывод

enter image description here

...