はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】Utf8Formatter.TryFormatを用いて一般的なデータ型をUtf8 文字列として書式設定する

はじめに

今回はUtf8Formatter.TryFormatについて紹介したいと思います。

int value = 999;
        
// e7, 3, 0, 0
Console.WriteLine(string.Join(",", BitConverter.GetBytes(value).Select(x => x.ToString("x"))));

// 書き込み先のメモリ領域
Span<byte> destination = new byte[4];

// 一般的なデータ型を Utf8 文字列として書式設定する
Utf8Formatter.TryFormat(value, destination, out var bytesWritten);

// 39, 39, 39, 0
Console.WriteLine(string.Join(",", destination.ToArray().Select(x => x.ToString("x"))));
        
// 3
Console.WriteLine(bytesWritten);

概要

Utf8FormatterにはデータをUtf8文字列に変換をする静的メソッドが含まれています。

一般的なデータ型を Utf8 文字列として書式設定するための静的メソッドを提供します。

learn.microsoft.com


書き込むデータの型が大量にあるのでメソッドが結構ありますが、本質的にはほとんど違いはありません。

public static bool TryFormat (bool value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (byte value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (DateTime value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (DateTimeOffset value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (decimal value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (double value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (Guid value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (short value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (int value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (long value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (sbyte value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (float value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (TimeSpan value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (ushort value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (uint value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);
public static bool TryFormat (ulong value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);

全部に注目してもあれなので、intだけに注目してみます。

public static bool TryFormat (int value, Span<byte> destination, out int bytesWritten, System.Buffers.StandardFormat format = default);

valueに書式を変換する値、destinationは書き込み先のメモリ領域、bytesWrittenは書き込んだbyteのサイズを格納する変数を渡します。

またSystem.Buffers.StandardFormatに関しては以下の通り。

オブジェクトは StandardFormat 、1 文字の標準書式指定子 ('G'、'D'、または 'X' など) と省略可能な有効桁数指定子で構成されます。 有効桁数指定子の範囲は 0 から 9 です。また、特殊な StandardFormat.NoPrecision 値を指定することもできます。

learn.microsoft.com

正直StandardFormatについてよく分かっていません。勉強します。

使い方

int value = 999;
        
// e7, 3, 0, 0
Console.WriteLine(string.Join(",", BitConverter.GetBytes(value).Select(x => x.ToString("x"))));

// 書き込み先のメモリ領域
Span<byte> destination = new byte[4];

// 一般的なデータ型を Utf8 文字列として書式設定する
Utf8Formatter.TryFormat(value, destination, out var bytesWritten);

// 39, 39, 39, 0
Console.WriteLine(string.Join(",", destination.ToArray().Select(x => x.ToString("x"))));
        
// 3
Console.WriteLine(bytesWritten);