public virtual byte[] GetBytes()
{
byte[] val = null;
if (Count > 0)
{
int esize = 0;
ArrayList al = new ArrayList();
foreach (ASN1 a in elist)
{
byte[] item = a.GetBytes();
al.Add(item);
esize += item.Length;
}
val = new byte[esize];
int pos = 0;
for (int i = 0; i < elist.Count; i++)
{
byte[] item = (byte[])al[i];
Buffer.BlockCopy(item, 0, val, pos, item.Length);
pos += item.Length;
}
}
else if (m_aValue != null)
{
val = m_aValue;
}
byte[] der;
int nLengthLen = 0;
if (val != null)
{
int nLength = val.Length;
// special for length > 127
if (nLength > 127)
{
if (nLength <= Byte.MaxValue)
{
der = new byte[3 + nLength];
Buffer.BlockCopy(val, 0, der, 3, nLength);
nLengthLen = 0x81;
der[2] = (byte)(nLength);
}
else if (nLength <= UInt16.MaxValue)
{
der = new byte[4 + nLength];
Buffer.BlockCopy(val, 0, der, 4, nLength);
nLengthLen = 0x82;
der[2] = (byte)(nLength >> 8);
der[3] = (byte)(nLength);
}
else if (nLength <= 0xFFFFFF)
{
// 24 bits
der = new byte[5 + nLength];
Buffer.BlockCopy(val, 0, der, 5, nLength);
nLengthLen = 0x83;
der[2] = (byte)(nLength >> 16);
der[3] = (byte)(nLength >> 8);
der[4] = (byte)(nLength);
}
else
{
// max (Length is an integer) 32 bits
der = new byte[6 + nLength];
Buffer.BlockCopy(val, 0, der, 6, nLength);
nLengthLen = 0x84;
der[2] = (byte)(nLength >> 24);
der[3] = (byte)(nLength >> 16);
der[4] = (byte)(nLength >> 8);
der[5] = (byte)(nLength);
}
}
else
{
// basic case (no encoding)
der = new byte[2 + nLength];
Buffer.BlockCopy(val, 0, der, 2, nLength);
nLengthLen = nLength;
}
if (m_aValue == null)
m_aValue = val;
}
else
der = new byte[2];
der[0] = m_nTag;
der[1] = (byte)nLengthLen;
return der;
}