将转义字符串转换为字节数组或数据流;c#

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
...
...    

请提供更多上下文信息。例如,你的字符串中第一个字符实际上是Unicode U+0000字符还是反斜杠?你想在流或字节数组中使用什么编码? - Jon Skeet
看起来你正在试图将二进制文件读取为文本。 - I4V
Encoding.Unicode页面的“示例”部分有一个很好的例子。 - SwDevMan81
@I4V 原始数据确实是二进制流。一个我无法控制的程序以这种形式将其输出到日志中。我想将其转换回流,以便我可以使用它。 - RaGe
@RaGe然后发布一个样本二进制数据,没有它很难说出任何东西。 - I4V
编辑添加预期的字节数组。 - RaGe
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的默认编码,但您当然可以明确指定它。)

我假设您有一个很好的理由以这种形式拥有“text”。我从来没有发现过使用U+0003(结束文本)的用途。如果像I4V建议的那样,此数据最初是以二进制流的形式存在的,您应该首先避免将其处理为文本。将二进制数据与文本数据分开——当您混合它们时,它会引起问题。(例如,如果您字符串中的第四个字符是U+00FF,则在编码为UTF-8时,它将变成两个字节,这可能不是您想要的。)


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))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接