UTF8のbyte[]の作り方

C#で、UTF8のbyte[]を作りたいときがあります。
実際のアプリに組み込む場合もありますし、テストで作りたい場合もありそうです。
C#11での書き方をいろいろ列挙してみます。

{"value":0.123}

上記のJSONを作る場合でやってみます。

public static byte[] JsonSample0 = Encoding.UTF8.GetBytes("{\"value\":0.123}");

結構昔から書ける書き方です。
初期化時に、UTF16→UTF8への変換コストがかかります。

public static byte[] JsonSample1 = Encoding.UTF8.GetBytes("""{"value":0.123}""");

JsonSample0と違って、C#11から使える”””を使ってみました。
“をエスケープしなくて良い分、見た目が良くなってミスが減りそうです。

public static byte[] JsonSample2 = "{\"value\":0.123}"u8.ToArray();
public static byte[] JsonSample3 = """{"value":0.123}"""u8.ToArray();

“”u8を使って、ReadOnlySpan<byte>が作れるので、そこからbyte[]に変換します。コピーのコストは発生しますが、UTF16→UTF8の変換に比べると、変換の速度はかなり速いです。
“をエスケープする方法と、”””でエスケープを外す方法を書いてみました。

public static byte[] JsonSample4 = new byte[] { (byte)'{' ,(byte)'"' ,(byte)'v' ,(byte)'a' ,(byte)'l' ,(byte)'u' ,(byte)'e' ,(byte)'"' ,(byte)':' ,(byte)'0' ,(byte)'.' ,(byte)'1' ,(byte)'2' ,(byte)'3' ,(byte)'}' , };

byte[]を直接作るとこんな感じ。
パフォーマンスはたぶん良いと思いますが、メンテナンスがつらいところですね。
というところで、私はJsonSample3を使っていくことになりそうです。

追記 2023/2/23
「ab”」のように、”で終わる場合、JsonSample3の書き方はできません。その場合、複数行モードで、以下の様な書き方がよさそうです。

public static byte[] JsonSample5 = """
    ab"
    """u8.ToArray();

この書き方だと、3byteのArrayになって、改行は入らないです。

投稿日:
カテゴリー: C#

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です