3

私の入力文字列は、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
...
...    
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 (END OF TEXT) の用途を見つけたとは言えません。I4V が示唆しているように、このデータがもともとバイナリ ストリームにあった場合は、最初からテキストとして処理することは避けてください。バイナリ データをテキスト データから分離します。それらを混在させると、問題が発生します。(たとえば、文字列の 4 番目の文字が U+00FF の場合、UTF-8 にエンコードすると最終的に 2 バイトになり、これはおそらく希望どおりではないでしょう。)

于 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 に答える