我需要有关在C#

时间:2018-12-06 02:00:42

标签: c# .net windows forms dictionary

这篇文章是关于我在C#(Visual Studio 2017中的Windows Forms App,.NET Framework)中遇到的困难,涉及使用“字符串,字符”格式的字典。

这是我所拥有的:

首先-一种格式的字典

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]);
}

此代码的功能是通过输入和输出文本框(已在我的GUI上成功设置)将二进制文件转换为ASCII。

本质上,它首先声明一个二进制值(以字符串表示)及其对应的ASCII值(以chars表示)的字典。

输入二进制的文本框是Input.Text,输出ASCII的文本框是AsciiOutput.Text(注意:字符串binninput表示Input.Text)

有一个基于Input(binninput / Input.Text)长度的循环,在每个二进制字母之间放置空格。例如,它将是01000001 01000010而不是0100000101000010。

循环的后半部分分别插入每个字母的8位二进制表示形式(因此,为什么要根据输入的长度重复该字母)。

Visual Studio不显示任何错误,但是我的GUI上的输出文本框(AsciiOutput.Text)为空。我对此不确定,但我认为问题在于

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

代码行。删除.ToString()函数会导致转换错误。我已经尝试了好几个小时,以字符,整数和字符串代替,以为这是一个基本错误,但是没有解决的办法,因此我为什么来这里。

(使用字符型字符串格式字典,我可以将ASCII转换为二进制,并且代码看起来非常相似;如果有人愿意,我也可以在此处发布它)

1 个答案:

答案 0 :(得分:0)

听起来您要尝试的是从给定的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