はじめに
今回は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 文字列として書式設定するための静的メソッドを提供します。
書き込むデータの型が大量にあるのでメソッドが結構ありますが、本質的にはほとんど違いはありません。
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 値を指定することもできます。
正直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);