<PackageReference Include="System.Memory" Version="4.6.2" />

FormattingHelpers

static class FormattingHelpers
using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace System.Buffers.Text { internal static class FormattingHelpers { public enum HexCasing : uint { Uppercase = 0, Lowercase = 8224 } internal const string HexTableLower = "0123456789abcdef"; internal const string HexTableUpper = "0123456789ABCDEF"; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountDigits(ulong value) { int num = 1; uint num2; if (value >= 10000000) { if (value >= 100000000000000) { num2 = (uint)(value / 100000000000000); num += 14; } else { num2 = (uint)(value / 10000000); num += 7; } } else num2 = (uint)value; if (num2 >= 10) num = ((num2 < 100) ? (num + 1) : ((num2 < 1000) ? (num + 2) : ((num2 < 10000) ? (num + 3) : ((num2 < 100000) ? (num + 4) : ((num2 >= 1000000) ? (num + 6) : (num + 5)))))); return num; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountDigits(uint value) { int num = 1; if (value >= 100000) { value /= 100000; num += 5; } if (value >= 10) num = ((value < 100) ? (num + 1) : ((value < 1000) ? (num + 2) : ((value >= 10000) ? (num + 4) : (num + 3)))); return num; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountHexDigits(ulong value) { int num = 1; if (value > uint.MaxValue) { num += 8; value >>= 32; } if (value > 65535) { num += 4; value >>= 16; } if (value > 255) { num += 2; value >>= 8; } if (value > 15) num++; return num; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static char GetSymbolOrDefault([In] [System.Runtime.CompilerServices.IsReadOnly] ref StandardFormat format, char defaultSymbol) { char c = format.Symbol; if (c == '' && format.Precision == 0) c = defaultSymbol; return c; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void FillWithAsciiZeros(Span<byte> buffer) { for (int i = 0; i < buffer.Length; i++) { buffer[i] = 48; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteHexByte(byte value, Span<byte> buffer, int startingIndex = 0, HexCasing casing = HexCasing.Uppercase) { uint num = (uint)(((value & 240) << 4) + (value & 15) - 35209); uint num2 = (uint)((int)((((0 - num) & 28784) >> 4) + num + 47545) | (int)casing); buffer[startingIndex + 1] = (byte)num2; buffer[startingIndex] = (byte)(num2 >> 8); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDigits(ulong value, Span<byte> buffer) { for (int num = buffer.Length - 1; num >= 1; num--) { ulong num2 = 48 + value; value /= 10; buffer[num] = (byte)(num2 - value * 10); } buffer[0] = (byte)(48 + value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDigitsWithGroupSeparator(ulong value, Span<byte> buffer) { int num = 0; for (int num2 = buffer.Length - 1; num2 >= 1; num2--) { ulong num3 = 48 + value; value /= 10; buffer[num2] = (byte)(num3 - value * 10); if (num == 2) { buffer[--num2] = 44; num = 0; } else num++; } buffer[0] = (byte)(48 + value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteDigits(uint value, Span<byte> buffer) { for (int num = buffer.Length - 1; num >= 1; num--) { uint num2 = 48 + value; value /= 10; buffer[num] = (byte)(num2 - value * 10); } buffer[0] = (byte)(48 + value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteFourDecimalDigits(uint value, Span<byte> buffer, int startingIndex = 0) { uint num = 48 + value; value /= 10; buffer[startingIndex + 3] = (byte)(num - value * 10); num = 48 + value; value /= 10; buffer[startingIndex + 2] = (byte)(num - value * 10); num = 48 + value; value /= 10; buffer[startingIndex + 1] = (byte)(num - value * 10); buffer[startingIndex] = (byte)(48 + value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteTwoDecimalDigits(uint value, Span<byte> buffer, int startingIndex = 0) { uint num = 48 + value; value /= 10; buffer[startingIndex + 1] = (byte)(num - value * 10); buffer[startingIndex] = (byte)(48 + value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong DivMod(ulong numerator, ulong denominator, out ulong modulo) { ulong num = numerator / denominator; modulo = numerator - num * denominator; return num; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint DivMod(uint numerator, uint denominator, out uint modulo) { uint num = numerator / denominator; modulo = numerator - num * denominator; return num; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountDecimalTrailingZeros(uint value, out uint valueWithoutTrailingZeros) { int num = 0; if (value != 0) { while (true) { uint modulo; uint num2 = DivMod(value, 10, out modulo); if (modulo != 0) break; value = num2; num++; } } valueWithoutTrailingZeros = value; return num; } } }