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/,因此对应的字母将是Š¦Ì¤°

到目前为止,我解决这个问题的所有尝试都失败了。解决方案可能真的很容易通过。。。

char[]数组到文本文件,包括非打印控制字符

开头的字符是编码前导码的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位整数的数组,而不是字符串。如果你愿意的话,你可以把数字变成一些文本表示,但你不能把它们用作字符代码,并且在解密时可靠地得到相同的结果。