2013-05-13 93 views
1

我的輸入字符串包含的Unicode轉義字符與常規字符例混合的混合物:將轉義字符串轉換爲bytearray或流; C#

\u0000\u0003\u0000\u0013timestamp\u0011clientId\u0015timeToLive\u0017destination\u000fheaders\tbody\u0013messageId\u0001\u0006 

我如何轉換這個轉換爲bytearray或流?

編輯:UTF + 8編碼。爲了澄清輸入字符串:

Char 01: U+0000 
Char 02: U+0003 
Char 03: U+0000 
Char 04: U+0013 
Char 05: t 
Char 06: i 
Char 07: m 
Char 08: e 
Char 09: s 
Char 10: t 
Char 11: a 
Char 12: m 
Char 13: p 
Char 14: U+0011 
... 
...  
+0

請給更多的上下文。例如,字符串中的第一個字符實際上是Unicode U + 0000字符還是反斜槓?你想在流或字節數組中使用什麼編碼? – 2013-05-13 18:24:20

+0

編輯的問題。 – RaGe 2013-05-13 18:34:12

+0

似乎你正試圖讀取一個二進制文件作爲文本。 – I4V 2013-05-13 18:34:21

回答

4

好了,你已經有了一個任意字符串(它包含非打印字符的事實是無關緊要的),你想將其轉換爲字節數組使用UTF-8 。這很容易:)

byte[] bytes = Encoding.UTF8.GetBytes(text); 

或者寫一個流,你通常包裝在一個StreamWriter

// Note that due to the using statement, this will close the stream at the end 
// of the block 
using (var writer = new StreamWriter(stream)) 
{ 
    writer.Write(text); 
} 

(UTF-8是StreamWriter的默認編碼,但您可以指定它當然是明確的。)

我假設你真的有一個很好的理由在這個表單中有「文本」。我不能說我曾經找到U + 0003(文字結束)的用法。如果像I4V建議的那樣,這個數據最初是一個二進制流,你應該避免把它作爲文本處理。從你的文本數據中分離出你的二進制數據 - 當你混合它們時,會導致問題。 (例如,如果你的字符串中的第四個字符是U + 00FF,那麼,當編碼爲UTF-8,這可能不會是你想要的最後兩個字節)。

0

爲了簡化剛轉換做到這一點:

var stream = new memoryStream(Encoding.UTF8.GetBytes(str)); 

或者,如果你想要的是有關於可重用性顧慮的做法,建立一個Extension Method爲字符串像這樣:

public static class StringExtension 
{ 
    public static Stream ToStream(this string str) 
     =>new memoryStream(Encoding.UTF8.GetBytes(str))   

    //Or much better 
    public static Stream ToStreamWithEncoding(this string str, Encoding encoding) 
     =>new memoryStream(encoding.GetBytes(str)) 
}