我如何使用自己的角色表?

时间:2012-11-15 01:14:49

标签: c# winforms character-encoding

所以我正在加载一个包含一些加密文本的文件,它使用自定义字符表,如何从外部文件加载它或将字符表放在代码中?

谢谢。

1 个答案:

答案 0 :(得分:1)

首先查看文件并计算行数,以便分配数组。你可以在这里使用一个列表,但数组有更好的性能,你有大量的项目,你必须循环很多(文件中的每个编码字符一次)所以我认为你应该使用数组代替

    int lines = 0;
    try 
    {
         using (StreamReader sr = new StreamReader("Encoding.txt")) 
        {
            string line;
            while ((line = sr.ReadLine()) != null) 
            {
                lines++;   
            }
        }
    }
    catch (Exception e) 
    {
        // Let the user know what went wrong.
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }

现在我们要分配和元组数组;

 Tuple<string, string> tuples = new Tuple<string, string>[lines];

之后我们将循环遍历文件,将每个键值对添加为元组。

     try 
    {
         using (StreamReader sr = new StreamReader("Encoding.txt")) 
        {
            string line;
            for (int i =0; i < lines; i++) 
            {
                line = sr.Readline();
                if (!line.startsWith('#')) //ignore comments
                {
                     string[] tokens = line.Split('='); //split for key and value
                     foreach(string token in tokens)
                           token.Trim(' '); // remove whitespaces

                    tuples[i].Item1 = tokens[0];
                    tuples[i].Item2 = tokens[1];
                }   
            }
        }
    }
    catch (Exception e) 
    {
        // Let the user know what went wrong.
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }

我已经给了你很多代码,虽然这可能需要一些修补工作。我没有在编译器中编写第二个循环,而且我懒得查找System.String.Trim之类的东西,并确保我正确使用它。我会把这些东西留给你。这有核心逻辑。如果你想改为使用列表,那么将for循环中的逻辑移动到while循环中,在那里我计算行数。

解码您正在阅读的文件时,您必须循环遍历此数组并比较键或值,直到您匹配为止。

另一件事 - 你的元组数组将有一些空索引(数组的长度为lines,而文件中实际有lines - comments + blankLines。当您尝试匹配字符时,您需要进行一些检查以确保您没有访问这些索引。或者,您可以增强文件读取,以便它不计算空行或注释,或从您读取的文件中删除这些行。最好的解决方案是增强文件读取,但这也是最重要的工作。