in Source/Tx.Network/Snmp/Asn1EncoderExtensions.cs [143:230]
public static int EncodeVarBinds(this byte[] data, int offset, IReadOnlyCollection<VarBind> varBinds)
{
int length = offset;
foreach (var item in varBinds)
{
offset = data.EncodeClassConstructType(offset, Asn1Class.Universal, ConstructType.Constructed, (byte)Asn1Tag.Sequence);
int tempOffset = data.EncodeOid(offset + 1, item.Oid.Oids);
if (item.Asn1TypeInfo.Asn1SnmpTagType == Asn1SnmpTag.NotSnmpData)
{
switch (item.Asn1TypeInfo.Asn1TagType)
{
case Asn1Tag.Integer:
{
tempOffset = data.EncodeLongInteger(tempOffset, Convert.ToInt64(item.Value));
break;
}
case Asn1Tag.Null:
{
tempOffset = data.EncodeNull(tempOffset);
break;
}
case Asn1Tag.OctetString:
{
tempOffset = data.EncodeOctetString(tempOffset, (string)item.Value);
break;
}
case Asn1Tag.ObjectIdentifier:
{
tempOffset = data.EncodeOid(tempOffset, ((ObjectIdentifier)item.Value).Oids);
break;
}
default:
{
tempOffset = data.EncodeNull(tempOffset);
break;
}
}
}
else
{
switch (item.Asn1TypeInfo.Asn1SnmpTagType)
{
case Asn1SnmpTag.Counter:
{
tempOffset = data.EncodeUnsignedInteger(tempOffset, (uint)item.Value, (byte)Asn1SnmpTag.Counter);
break;
}
case Asn1SnmpTag.IpAddress:
{
tempOffset = data.EncodeIPAddress(tempOffset, (System.Net.IPAddress)item.Value);
break;
}
case Asn1SnmpTag.Counter64:
{
tempOffset = data.EncodeUnsignedLong(tempOffset, (ulong)item.Value, (byte)Asn1SnmpTag.Counter64);
break;
}
case Asn1SnmpTag.Gauge:
{
tempOffset = data.EncodeUnsignedInteger(tempOffset, (uint)item.Value, (byte)Asn1SnmpTag.Gauge);
break;
}
case Asn1SnmpTag.TimeTicks:
{
tempOffset = data.EncodeUnsignedInteger(tempOffset, (uint)item.Value, (byte)Asn1SnmpTag.TimeTicks);
break;
}
case Asn1SnmpTag.UInt32:
{
tempOffset = data.EncodeUnsignedInteger(tempOffset, (uint)item.Value, (byte)Asn1SnmpTag.UInt32);
break;
}
default:
{
tempOffset = data.EncodeNull(tempOffset);
break;
}
}
}
data.EncodeLength(offset, tempOffset - offset);
offset = tempOffset;
}
return offset - length;
}