<PackageReference Include="System.Formats.Asn1" Version="10.0.0-preview.6.25358.103" />

AsnCharacterStringEncodings

using System.Runtime.InteropServices; using System.Text; namespace System.Formats.Asn1 { internal static class AsnCharacterStringEncodings { private static readonly UTF8Encoding s_utf8Encoding = new UTF8Encoding(false, true); private static readonly BMPEncoding s_bmpEncoding = new BMPEncoding(); private static readonly IA5Encoding s_ia5Encoding = new IA5Encoding(); private static readonly VisibleStringEncoding s_visibleStringEncoding = new VisibleStringEncoding(); private static readonly NumericStringEncoding s_numericStringEncoding = new NumericStringEncoding(); private static readonly PrintableStringEncoding s_printableStringEncoding = new PrintableStringEncoding(); private static readonly T61Encoding s_t61Encoding = new T61Encoding(); internal static Encoding GetEncoding(UniversalTagNumber encodingType) { switch (encodingType) { case UniversalTagNumber.UTF8String: return s_utf8Encoding; case UniversalTagNumber.NumericString: return s_numericStringEncoding; case UniversalTagNumber.PrintableString: return s_printableStringEncoding; case UniversalTagNumber.IA5String: return s_ia5Encoding; case UniversalTagNumber.VisibleString: return s_visibleStringEncoding; case UniversalTagNumber.BMPString: return s_bmpEncoding; case UniversalTagNumber.TeletexString: return s_t61Encoding; default: throw new ArgumentOutOfRangeException("encodingType", encodingType, null); } } internal unsafe static int GetByteCount(this Encoding encoding, ReadOnlySpan<char> str) { if (str.IsEmpty) str = string.Empty.AsSpan(); fixed (char* chars = &MemoryMarshal.GetReference(str)) { return encoding.GetByteCount(chars, str.Length); } } internal unsafe static int GetBytes(this Encoding encoding, ReadOnlySpan<char> chars, Span<byte> bytes) { if (chars.IsEmpty) chars = string.Empty.AsSpan(); if (bytes.IsEmpty) bytes = Array.Empty<byte>(); fixed (char* chars2 = &MemoryMarshal.GetReference(chars)) { fixed (byte* bytes2 = &MemoryMarshal.GetReference(bytes)) { return encoding.GetBytes(chars2, chars.Length, bytes2, bytes.Length); } } } } }