我有一个非常棘手的问题(至少对我而言),我目前正在编写一个小而简单的加密和解密程序,该程序可用于多字母替换。
这是加密功能:
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 FE 8A 00 A6 00 CC 00 A4 00 B0 00
粗体的是正确的,FF FE在开始时对我的加密/解密完全没用,00是不需要的(我知道这是标准的Unicode编码,我的问题是如何在没有这种编码的情况下实现它但是仍然能够显示相应的Unicode字符)我希望很清楚我想要实现的目标,我只想写出这些人物。 因此,在这种特殊情况下,加密文件的十六进制视图将如下所示: 8A A6 CC A4 B0 ,根据http://unicode-table.com/编码为Unicode UTF-8,因此相应的字母将为Š|Ì°
到目前为止,我在解决这个问题的所有尝试中都失败了。通过......解决方案可能非常简单。
答案 0 :(得分:1)
是否有理由不使用Encoding.UTF8
?
答案 1 :(得分:1)
开头的字符是编码前导码的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);
}
答案 2 :(得分:0)
你看起来有什么用,但它并没有真正起作用。加密字符代码后,再将它们视为字符代码是没有意义的,它们只是数值。大多数值都对应于某些字符,但不是全部。
加密的正确输出是16位整数的数组,而不是字符串。然后,您可以根据需要将数字转换为某种文本表示形式,但不能将它们用作字符代码,并在解密时可靠地获得相同的结果。