3

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

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

如何将其转换为字节数组或流?

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

2 回答 2

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 时它会以两个字节结束,这可能不是您想要的。)

于 2013-05-13T18:35:41.247 回答
1

要简化转换,只需执行以下操作:

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

或者,如果您想要一种担心可重用性的方法,请为字符串创建一个扩展方法,如下所示:

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))
}
于 2015-12-29T17:37:53.760 回答