2011-03-03 80 views
2

我有一个表示字节字符串表示

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); 
} 

如何转换我从一个文本表示字节的字符串中的字符串中的任何想法?谢谢!

+0

不要这样写。你不想编写一个C#编译器来读回它。并且不要将字节存储在字符串中,并非所有字节值都是合法的Unicode字符。使用Convert.ToBase64String将byte []编码为可以轻松写入文本文件的字符串。 – 2011-03-03 01:53:40

+1

当问题得到解答时,您可以将它们标记为:) – PedroC88 2011-03-03 13:02:14

回答

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"); 
+0

谢谢!你的第二个例子正是我想要的。该文件必须有文字(我在做的实际上是解析.cs文件寻找这些特殊的字符串,并操纵它们)。 – YWsecond 2011-03-04 00:12:27

0

使用Encoding.ASCII.GetString(byte[])方法。它也可以从所有其他编码中获得。确保你总是使用相同的编码来解码字节[],就像你用来编码它一样,否则你每次都得不到相同的值。

Here就是一个例子。

0

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

Byte b = Byte.Parse(s); 
+0

是的,但不解析“\ x00af”。 – 2011-03-03 01:48:05

1

不知道如果我理解正确的问题,但你不能写入字符串s到文件中。您在WriteLine声明中有额外的\WriteLine("\\x00af")写入字符\x00af,由于第一\充当逃逸到第二个...

您的意思是

sw.WriteLine("\x00af"); 

sw.WriteLine(s); 

取而代之?这在我的测试中按预期工作。