将转义字符串转换为bytearray或stream; C#

时间:2013-05-13 18:22:58

标签: c# unicode stream bytearray

我的输入字符串由混合了常规字符的unicode转义字符组成。例如:

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

如何将其转换为bytearray或Stream?

编辑: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
...
...    

2 个答案:

答案 0 :(得分: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时它最终会变为两个字节,这可能不是你想要的。)

答案 1 :(得分: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))
}