2011-03-03 77 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); 

取而代之?這在我的測試中按預期工作。