2

我在使用 UTF8Encoder 解码文件时遇到问题。

我正在从使用 UTF8(字符串 > 字节)编码的文件中读取文本,请参阅以下方法。

public static void Encode(string Path)
    {
        string text;
        Byte[] bytes;
        using (StreamReader sr = new StreamReader(Path))
        {
            text = sr.ReadToEnd();
            UTF8Encoding Encoding = new UTF8Encoding();
            bytes = Encoding.GetBytes(text);
            sr.Close();
        }
        using (StreamWriter sw = new StreamWriter(Path))
        {
            foreach (byte b in bytes)
                sw.Write(b.ToString());
            sw.Close();
        }
    }

然后我使用该方法对其进行解码

    public static String Decode(string Path)
    {
        String text;
        Byte[] bytes;
        using (StreamReader sr = new StreamReader(Path))
        {
            text = sr.ReadToEnd();
            UTF8Encoding Encoding = new UTF8Encoding();
            bytes = Encoding.GetBytes(text);
            text = Encoding.GetString(bytes);
            return text;
        }
    }

但是,它没有解码字节以使其返回文本,而是将其作为一串数字返回。我看不出我做错了什么,因为我对此并没有太多经验。

编辑:澄清我想要实现的目标。我试图让一个文本文件将文本保存为字节,而不是字符/数字。这是为文件提供非常简单的加密,因此您无法修改它们,除非您知道自己在做什么。然后使用解码函数从文件中读取文本(字节)并将它们转换为可读文本。我希望这能澄清我想要实现的目标。

PS:对不起,没有评论,但我认为它足够短,可以理解

4

3 回答 3

4

你到底想达到什么目的?UTF-8(和所有其他Encodings)是一种将字符串转换为字节数组(文本到原始数据)的方法,反之亦然。StreamReaderStreamWriter用于从/向文件读取/写入字符串。无需在那里重新编码任何东西。只需使用reader.ReadToEnd()将返回正确的字符串。

您的一段代码似乎试图编写一个包含与给定文本的 UTF-8 字节相对应的数字列表(作为可读的文本表示形式)的文件。好的。尽管这是一个非常奇怪的想法(我希望你不要试图用它来做任何“加密”之类的事情。),如果这确实是你想要做的,这绝对是可能的。但是您需要以某种方式分隔可读的数字,例如通过换行符,并在读回它们时对其进行解析:

public static void Encode(string path)
{
    byte[] bytes;
    using (var sr = new StreamReader(path))
    {
        var text = sr.ReadToEnd();
        bytes = Encoding.UTF8.GetBytes(text);
    }
    using (var sw = new StreamWriter(path))
    {
        foreach (byte b in bytes)
        {
            sw.WriteLine(b);
        }
    }
}

public static void Decode(string path)
{
    var data = new List<byte>();
    using (var sr = new StreamReader(path))
    {
        string line;
        while((line = sr.ReadLine()) != null)
            data.Add(Byte.Parse(line));
    }
    using (var sw = new StreamWriter(path))
    {
        sw.Write(Encoding.UTF8.GetString(data.ToArray()));
    }
}
于 2012-09-27T15:08:32.640 回答
0

此代码会将加密的字符串解码为文本,它对我有用。

public static String Decode(string Path)
    {
        String text;
        using (StreamReader sr = new StreamReader(Path))
        {
                text = st.ReadToEnd();
                byte[] bytes = Convert.FromBase64String(text);
                System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
                System.Text.Decoder decoder = encoder.GetDecoder();
                int count = decoder.GetCharCount(bytes, 0, bytes.Length);
                char[] arr = new char[count];
                decoder.GetChars(bytes, 0, bytes.Length, arr, 0);
                text= new string(arr);

                return text;
        }
    }
于 2012-09-27T14:53:24.560 回答
0

该类将为您处理解码,因此您的StreamReader方法Decode()可以像这样简单:

public static string Decode(string path)
{
    // This StreamReader constructor defaults to UTF-8
    using (StreamReader reader = new StreamReader(path))
        return reader.ReadToEnd();
}

我不确定您的Encode()方法应该做什么,因为其意图似乎是将文件读取为 UTF-8,然后将文本写回与 UTF-8 完全相同的文件。这样的事情可能更有意义:

public static void Encode(string path, string text)
{
    // This StreamWriter constructor defaults to UTF-8
    using (StreamWriter writer = new StreamWriter(path))
        writer.Write(text);
}
于 2012-09-27T15:03:19.667 回答