char[]数组到文本文件,包括非打印控制字符
本文关键字:包括非 打印 控制字符 文件 文本 数组 char | 更新日期: 2023-09-27 18:29:01
我有一个相当棘手的问题(至少对我来说),我目前正在编写一个小而简单的加密和解密程序,该程序可以使用多字母替换。
这是加密功能:
static string Encr(string plainText, string key)
{
char[] chars = new char[plainText.Length];
int h = 0;
for (int i = 0; i < plainText.Length; i++)
{
if (h == key.Length)
h = 0;
int j = plainText[i] + key[h];
chars[i] = (char)j;
h++;
}
StreamWriter sw = new StreamWriter(FILE_NAME, false, Encoding.Unicode);
for (int x = 0; x < plainText.Length; x++)
{
sw.Write(chars[x]);
}
sw.Close();
return new string(chars);
}
它运行良好,现在我的问题是StreamWriter创建的outputFile包含额外的不需要的00(由于Unicode编码)和2个完全错误的起始值,这也是由于Unicode编码
http://abload.de/img/unbenannt-16ilx4.jpg(很抱歉,我不能直接发布图片,因为我<10rep)
FF FE8A00A600CC00A40B0000
粗体是正确的,一开始的FF FE对我的加密/解密完全没有用,00是不需要的(我知道这是标准的Unicode编码,我的问题是如果没有这种编码,我如何实现它,但仍然能够显示相应的Unicode字符)
我希望我想达到的目标是明确的,我只想把人物写出来。因此,在这种特殊情况下,加密文件的十六进制视图如下所示:8A A6 CC A4 B0,根据http://unicode-table.com/,因此对应的字母将是Š¦Ì¤°
到目前为止,我解决这个问题的所有尝试都失败了。解决方案可能真的很容易通过。。。
开头的字符是编码前导码的2个字节,用于标识所使用的编码。我认为您最好转换为字节,并将字节写入一个没有任何编码的通用二进制文件。
如:
static string Encr(string plainText, string key)
{
char[] chars = new char[plainText.Length];
int h = 0;
for (int i = 0; i < plainText.Length; i++)
{
if (h == key.Length)
h = 0;
int j = plainText[i] + key[h];
chars[i] = (char)j;
h++;
}
File.WriteAllBytes(FILE_NAME, System.Text.Encoding.UTF8.GetBytes(chars));
return new String(chars, System.Text.Encoding.UTF8);
}
是否有理由不使用Encoding.UTF8
?
您所拥有的似乎在起作用,但实际上并不起作用。当你加密了字符代码后,再把它们看作字符代码就没有意义了,它们只是数值。大多数值将对应于某个字符,但不是全部字符。
加密的正确输出应该是16位整数的数组,而不是字符串。如果你愿意的话,你可以把数字变成一些文本表示,但你不能把它们用作字符代码,并且在解密时可靠地得到相同的结果。