【问题标题】:String representation of byte array字节数组的字符串表示
【发布时间】:2011-03-03 01:21:53
【问题描述】:

我有一个代表一个字节的字符串

string s = "\x00af";

我将此字符串写入文件,因此文件包含文字“\x00af”而不是它所代表的字节,后来我从文件中读取了这个字符串,我现在如何再次将此字符串视为字节(而不是文字)?

这是一个示例代码:

public static void StringAndBytes()
{
    string s = "\x00af";
    byte[] b = Encoding.ASCII.GetBytes(s);

    // Length would be 1
    Console.WriteLine(b.Length);

    // Write this to a file as literal
    StreamWriter sw = new StreamWriter("c:\\temp\\MyTry.txt");
    sw.WriteLine("\\x00af");
    sw.Close();

    // Read it from the file
    StreamReader sr = new StreamReader("c:\\temp\\MyTry.txt");
    s = sr.ReadLine();
    sr.Close();

    // Get the bytes and Length would be 6, as it treat the string as string
    // and not the byte it represents
    b = Encoding.ASCII.GetBytes(s);
    Console.WriteLine(b.Length);
}

关于如何将字符串从文本转换为表示字节的字符串的任何想法?谢谢!

【问题讨论】:

  • 别这样写。您不需要编写 C# 编译器来读回它。并且永远不要将字节存储在字符串中,并非所有字节值都是合法的 Unicode 字符。使用 Convert.ToBase64String 将 byte[] 编码为可以轻松写入文本文件的字符串。
  • 当问题得到回答时,您可以将它们标记为 ;)

标签: c# string byte bytearray


【解决方案1】:

文件内容是否必须具有字符串文字?如果不是,那么您可能希望将byte[] b 数组直接写入文件。这样,当您阅读它时,它就是您所写的。

byte[] b = Encoding.UTF32.GetBytes(s);
File.WriteAllBytes ("c:\\temp\\MyTry.txt", b);

b = File.ReadAllBytes ("c:\\temp\\MyTry.txt");
s = Encoding.UTF32.GetString (b);

如果您需要文件内容具有字符串文字,同时能够将其转换为写入的原始文本,则必须选择正确的编码。我相信 UTF32 是最好的。

    b = new byte[4];
    b[0] = Byte.Parse(s.Substring(2), System.Globalization.NumberStyles.AllowHexSpecifier);
    string v = Encoding.UTF32.GetString(b);
    string w = "\x00af";

    if (v != w)
        MessageBox.Show("Diff [" + w + "] = [" + v + "] ");
    else
        MessageBox.Show("Same");

【讨论】:

  • 谢谢!你的第二个例子正是我想要的。该文件必须具有文字(我实际上正在解析 .cs 文件以查找这些特殊字符串并对其进行操作)。
【解决方案2】:

不确定我是否正确理解了这个问题,但您没有将字符串 s 写入文件。您的WriteLine 声明中有一个额外的\WriteLine("\\x00af") 写入字符 \x00af,因为第一个 \ 充当对第二个的逃生...

你是说

sw.WriteLine("\x00af");

sw.WriteLine(s);

相反?这在我的测试中按预期工作。

【讨论】:

    【解决方案3】:

    使用Encoding.ASCII.GetString(byte[]) 方法。它也可从所有其他编码中获得。确保始终使用与编码它时相同的编码来解码 byte[],否则每次都不会得到相同的值。

    Here 就是一个例子。

    【讨论】:

      【解决方案4】:

      只解析一个代表每个字节的字符串:

      Byte b = Byte.Parse(s);
      

      【讨论】:

      • 是,但不解析“\x00af”。
      猜你喜欢
      • 2016-03-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2018-07-23
      • 2022-01-18
      • 2017-10-07
      • 2021-12-22
      相关资源
      最近更新 更多