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);
}
}
}
}
}