<PackageReference Include="BouncyCastle.Cryptography" Version="2.5.0" />

BerBitString

public class BerBitString : DLBitString
using System; namespace Org.BouncyCastle.Asn1 { public class BerBitString : DLBitString { private readonly DerBitString[] elements; public static BerBitString FromSequence(Asn1Sequence seq) { return new BerBitString(seq.MapElements(DerBitString.GetInstance)); } internal static byte[] FlattenBitStrings(DerBitString[] bitStrings) { int num = bitStrings.Length; switch (num) { case 0: return DerBitString.EmptyOctetsContents; case 1: return bitStrings[0].m_contents; default: { int num2 = num - 1; int num3 = 0; for (int i = 0; i < num2; i++) { byte[] contents = bitStrings[i].m_contents; if (contents[0] != 0) throw new ArgumentException("only the last nested bitstring can have padding", "bitStrings"); num3 += contents.Length - 1; } byte[] contents2 = bitStrings[num2].m_contents; byte b = contents2[0]; num3 += contents2.Length; byte[] array = new byte[num3]; array[0] = b; int num4 = 1; for (int j = 0; j < num; j++) { byte[] contents3 = bitStrings[j].m_contents; int num5 = contents3.Length - 1; Array.Copy(contents3, 1, array, num4, num5); num4 += num5; } return array; } } } public BerBitString(byte data, int padBits) : base(data, padBits) { elements = null; } public BerBitString(byte[] data) : this(data, 0) { } public BerBitString(byte[] data, int padBits) : base(data, padBits) { elements = null; } [Obsolete("Use version without segmentLimit (which is ignored anyway)")] public BerBitString(byte[] data, int padBits, int segmentLimit) : this(data, padBits) { } public BerBitString(int namedBits) : base(namedBits) { elements = null; } public BerBitString(Asn1Encodable obj) : this(obj.GetDerEncoded(), 0) { } public BerBitString(DerBitString[] elements) : base(FlattenBitStrings(elements), false) { this.elements = elements; } [Obsolete("Use version without segmentLimit (which is ignored anyway)")] public BerBitString(DerBitString[] elements, int segmentLimit) : this(elements) { } internal BerBitString(byte[] contents, bool check) : base(contents, check) { elements = null; } internal override IAsn1Encoding GetEncoding(int encoding) { if (1 != encoding) return base.GetEncoding(encoding); if (elements == null) return new PrimitiveEncoding(0, 3, m_contents); Asn1Encodable[] array = elements; return new ConstructedILEncoding(0, 3, Asn1OutputStream.GetContentsEncodings(encoding, array)); } internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo) { if (1 != encoding) return base.GetEncodingImplicit(encoding, tagClass, tagNo); if (elements == null) return new PrimitiveEncoding(tagClass, tagNo, m_contents); Asn1Encodable[] array = elements; return new ConstructedILEncoding(tagClass, tagNo, Asn1OutputStream.GetContentsEncodings(encoding, array)); } } }