将字节数组写入 txt 文件给出奇怪的字符 (c#)

Writting byte array to txt file gives weird characters (c#)

我有大量不同数字 (0-256) 的字节。首先,我用 File.WriteAllText 创建了一个 .txt 文件并写了几行文本。之后我想在文本之后将我的字节数组保存到这个文件中,但是当我用记事本打开它时,里面有奇怪的字符。这是编码问题吗?

String filename = "filename.txt";
String text = "Some metadata........" + Environment.NewLine;
System.IO.File.WriteAllText(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), filename), text);

using (var stream = new FileStream(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), filename), FileMode.Append))
    {
        stream.Write(data_tmp, 0, data_tmp.Length);
        stream.Close();
    }

这是我用记事本打开 .txt 时看到的内容:

一些元数据.......

øÀþð?øÀüà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþð?øÀþà?øÀüàø€üàðüÀ~ð?øÀ~ð?øÀþð ?þà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüà?ø€üàð€üà~ð?üÀ~ð?øÀþð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþà?øÀüà ?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþð?øÀþà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüà?ø €üàð€üà~ð?üÀ~ð?øÀþð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþà?øÀüà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüàø€üàðüà~ð ?üÀ~ð?øÀþð?øÀþà?øÀüàø€üàðüÀ~ð?øÀ~ð?øÀþà?øÀüà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþð ?øÀþà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþð?øÀþà?øÀüàø€üàðüÀ~ð?øÀ~ð?øÀþà?øÀüà?ø€üàð €üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþð?øÀþà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀþà?øÀüà?ø€üàð€üà ~ð?üÀ~ð?øÀþð?øÀþà?øÀüàø€üàðüà~ð?üÀ~ð?øÀþà?øÀüà?ø€üàð€üà~ðüÀ~ð?øÀ~ð?øÀ(等等)

你的问题含糊不清。可能您想 字节编码成一些文本,比如十六进制表示?

   String text = 
     "Some metadata........" + 
      Environment.NewLine + 
      String.Join(" ", data_tmp.Select(x => x.ToString("x2"))); // <- encoding 

   System.IO.File.WriteAllText(..., text);

没有FileStream?所以你会有这样的东西:

   Some metadata........
   ab 45 25 e8 f0 03     // <- encoded array 

如果您只想看到该数组中字节的十进制表示形式,则必须将它们转换为该十进制数,然后转换为字符串,然后转换为该字符串的字节表示形式。

您现在正在做的是将数组中的字节解释为字符的 UTF8(这是标准编码)表示形式。

所以假设字节的十进制表示是您想要的,您可以这样做:

        Encoding utf8 = Encoding.UTF8;
        byte[] data_tmp = new byte[] { 1, 2, 3, 4 };
        String filename = "filename.txt";
        String text = "Some metadata........" + Environment.NewLine;
        System.IO.File.WriteAllText(
            System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), filename), text, utf8);

        using (var stream = new FileStream(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), filename), FileMode.Append))
        {
            IEnumerable<byte[]> bytesToStringedInUtf8 = data_tmp.Select(b => utf8.GetBytes(((int)b).ToString()));
            foreach (byte[] byteToStringedInUtf8 in bytesToStringedInUtf8)
            {
                stream.Write(byteToStringedInUtf8, 0, byteToStringedInUtf8.Length);
            }
            stream.Close();
        }

输出为:

一些元数据.......

1234