从文件读取的字节数组和从同一文件读取的字符串转换的字节数组不同

时间:2017-10-04 06:23:06

标签: c#

如果我从文件中读取字节数组并使用下面的代码

编写它
  byte[] bytes = File.ReadAllBytes(filePath);

  File.WriteAllBytes(filePath, byteArr);

工作得非常好。我可以正确打开并查看书面文件。

但是如果我将文件内容读入字符串然后使用以下函数将其转换为字节数组

  string s = File.ReadAllText(filePath);
  var byteArr = System.Text.Encoding.UTF8.GetBytes(s);

字节数组的大小比直接从文件读取的前一个数组大,并且值也不同,因此如果我使用此数组写入文件,则打开时无法读取

注意: - 文件是utf-8编码的 我发现使用下面的代码

    using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8, true))
        {
            reader.Peek(); // you need this!
            var encoding = reader.CurrentEncoding;
        } 

无法理解为什么两个数组都不同?

我使用下面附带的图片进行转换然后再写

image

2 个答案:

答案 0 :(得分:2)

using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8, true))
{
    reader.Peek(); // you need this!
    var encoding = reader.CurrentEncoding;
} 

您的var encoding只会回显Encoding.UTF8参数。你在那里欺骗自己。

二进制文件没有文本编码。

  

需要保存文件可能是图像或文本

然后只使用ReadAllBytes / WriteAllBytes。文本文件始终也是byte[],但并非所有文件类型都是文本。您首先需要Base64编码,这只会增加大小。

答案 1 :(得分:1)

将字节数组转换为字符串的最安全方法实际上是将它编码为base64。 像:

string s = Convert.ToBase64String(bytes);

byte [] bytes = Convert.FromBase64String; s