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

BMPEncoding

Big-Endian UCS-2 encoding (the same as UTF-16BE, but disallowing surrogate pairs to leave plane 0)
using System.Buffers.Binary; using System.Text; namespace System.Formats.Asn1 { internal sealed class BMPEncoding : SpanBasedEncoding { protected override int GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes, bool write) { if (chars.IsEmpty) return 0; int num = 0; for (int i = 0; i < chars.Length; i++) { char c = chars[i]; if (char.IsSurrogate(c)) { base.EncoderFallback.CreateFallbackBuffer().Fallback(c, i); throw new InvalidOperationException(); } ushort num2 = c; if (write) { bytes[num + 1] = (byte)num2; bytes[num] = (byte)(num2 >> 8); } num += 2; } return num; } protected override int GetChars(ReadOnlySpan<byte> bytes, Span<char> chars, bool write) { if (bytes.IsEmpty) return 0; ReadOnlySpan<byte> readOnlySpan; if (bytes.Length % 2 != 0) { DecoderFallbackBuffer decoderFallbackBuffer = base.DecoderFallback.CreateFallbackBuffer(); readOnlySpan = bytes.Slice(bytes.Length - 1); decoderFallbackBuffer.Fallback(readOnlySpan.ToArray(), bytes.Length - 1); throw new InvalidOperationException(); } int num = 0; for (int i = 0; i < bytes.Length; i += 2) { char c = (char)BinaryPrimitives.ReadInt16BigEndian(bytes.Slice(i)); if (char.IsSurrogate(c)) { DecoderFallbackBuffer decoderFallbackBuffer2 = base.DecoderFallback.CreateFallbackBuffer(); readOnlySpan = bytes.Slice(i, 2); decoderFallbackBuffer2.Fallback(readOnlySpan.ToArray(), i); throw new InvalidOperationException(); } if (write) chars[num] = c; num++; } return num; } public override int GetMaxByteCount(int charCount) { return checked(charCount * 2); } public override int GetMaxCharCount(int byteCount) { return byteCount / 2; } } }