public static byte[] Encode(string format, params object[] args)
{
var output = new BerMemoryOutput();
var paramIndex = 0;
for (int charIndex = 0; charIndex < format.Length; charIndex++)
{
var ch = format[charIndex];
switch (ch)
{
case '{':
EncodeHeader(output, TypeTags.Sequence, BerDefinitions.IndefiniteLength);
break;
case '}':
output.WriteByte(0);
output.WriteByte(0);
break;
case 'b':
{
EncodeHeader(output, TypeTags.Boolean, 1);
BerEncoding.EncodeBoolean(output, (bool)args[paramIndex++]);
break;
}
case 'i':
case 'd':
{
var value = (int)args[paramIndex++];
var valueLength = BerEncoding.GetIntegerLength(value);
EncodeHeader(output, TypeTags.Integer, valueLength);
BerEncoding.EncodeInteger(output, value, (int)valueLength);
break;
}
case 'l':
case 't':
{
var value = (long)args[paramIndex++];
var valueLength = BerEncoding.GetLongLength(value);
EncodeHeader(output, TypeTags.Integer, valueLength);
BerEncoding.EncodeLong(output, value, (int)valueLength);
break;
}
case 's':
{
var value = (string)args[paramIndex++];
var valueLength = BerEncoding.GetUtf8StringLength(value);
EncodeHeader(output, TypeTags.UTF8String, valueLength);
BerEncoding.EncodeUtf8String(output, value);
break;
}
case 'y':
{
var value = (byte[])args[paramIndex++];
var valueLength = value.Length;
EncodeHeader(output, TypeTags.OctetString, valueLength);
BerEncoding.EncodeByteArray(output, value);
break;
}
case 'f':
case 'r':
{
var value = (double)args[paramIndex++];
var local = new BerMemoryOutput();
var valueLength = BerEncoding.EncodeReal(local, value);
EncodeHeader(output, TypeTags.Real, valueLength);
output.WriteBytes(local.Memory);
break;
}
case 'o':
{
var value = (int[])args[paramIndex++];
var local = new BerMemoryOutput();
var valueLength = BerEncoding.EncodeRelativeOid(local, value);
EncodeHeader(output, TypeTags.RelativeOid, valueLength);
output.WriteBytes(local.Memory);
break;
}
case 'g':
{
var value = (DateTime)args[paramIndex++];
var local = new BerMemoryOutput();
var valueLength = BerEncoding.EncodeGeneralizedTime(local, value);
EncodeHeader(output, TypeTags.GeneralizedTime, valueLength);
output.WriteBytes(local.Memory);
break;
}
}
}
return(output.ToArray());
}