所以我正在加载一个包含一些加密文本的文件,它使用自定义字符表,如何从外部文件加载它或将字符表放在代码中?
谢谢。
答案 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
。当您尝试匹配字符时,您需要进行一些检查以确保您没有访问这些索引。或者,您可以增强文件读取,以便它不计算空行或注释,或从您读取的文件中删除这些行。最好的解决方案是增强文件读取,但这也是最重要的工作。