【发布时间】:2016-07-29 19:53:44
【问题描述】:
我正在开发一个使用纯 ASCII .txt 文件作为键/值配置文件的项目。 ConfigFile.txt 的当前格式类似于
FirstName=Elmer|LastName=Fudd|UserId=EFudd|Password=fubar|Date=7/29/2016
这很容易读入程序并使用 KeyValuePairs 创建一个字典,代码如下:
using (FileStream fs = new FileStream("ConfigFile.txt", FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs))
{
string fileText = sr.ReadToEnd();
// Tokenize the entire file string into separate key=value strings.
string[] tokens = fileText.Split('|');
// Iterate through all of the key=value strings, tokenize each one into a key=Value
// pair and add the key and value as separate strings into the dictionary.
foreach (string token in tokens)
{
string[] keyValuePair = token.Split('=');
configDict.Add(keyValuePair[0], keyValuePair[1]);
}
}
}
它首先使用“|”将每个键/值拆分为单独的字符串作为分隔符。
名字=埃尔默
姓氏=法德
UserId=EFudd
密码=foobar
日期=2016 年 7 月 29 日
然后,对于每个键/值字符串,它在 '=' 分隔符上分隔键和值,创建一个 KeyValuePair,并将其插入到字典中以供以后在程序中查找。
到目前为止一切顺利。指示用户不要使用任何一个分隔符创建密码。但是,我现在必须在将密码包含在文件中之前对其进行加密,并且加密例程可以生成从 0x20 到 0x7F 的任何可打印字符。因此,加密的密码可以以一个或两个分隔符结尾。我最终可以通过加密引擎将“foobar”(或其他)加密为 P#|=g%。这会破坏 split 函数正常工作的能力。
所以,我想更改输入到记事本 .txt 文件中的分隔符来控制字符,而不是使用“|”分隔符,我使用 0x1E(记录分隔符)并将“=”符号替换为 0x1F(单位分隔符)。
我可以毫无问题地直接在 C# 中转义和编码,但我将如何修改原始 .txt 磁盘文件,以便它在分隔符中正确读取为单个(不可打印)字符?
【问题讨论】:
-
为什么密码是明文?使用哈希,然后使用 base64 或 hex 对二进制文件进行编码。
-
至于如何读取文件,就像您当前正在读取文件一样。如果您想发疯,您可以访问原始文件流,但这比在 SO 上解释要费力。
-
我继承了明文密码。在将加密文本手动输入配置文件之前,我编写了一个实用程序来对它们进行加密,因此磁盘或内存上没有明文。应用程序在使用它们之前使用相同的加密来解密它们。
-
使用 JSON 来存储这样的东西,甚至是 XML。
-
我理解这个问题,但我认为您低估了编码和解码控制字符的内容。可能有一个实用程序可以为您执行此操作,但我找到的最接近的是Regex.Unescape,它适用于正则表达式语法,但不适用于 c# 语法。这可能就是你想要的。
标签: c# string file text non-ascii-characters