2013-05-13 124 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)) 
}