private int NpduLength(byte[] message)
{
if (_bvlc.Length + 2 > message.Length)
return 0;
int npduLength = 2, npduStart = _bvlc.Length;
if (npduStart > 3)
{
byte version = message[npduStart];
byte npci = message[npduStart + 1];
bool destSpecified = false, sourceSpecified = false;
for (int i = 0; i < 8; i++)
{
if ((npci >> i & 1) == 1)
{
switch (i)
{
case 3:
sourceSpecified = true;
break;
case 5:
destSpecified = true;
break;
}
}
}
int destAddrLen = -1, sourceAddrLen = -1;
if (destSpecified)
{
destAddrLen = message[npduStart + 4];
npduLength = 6 + destAddrLen;
}
if (sourceSpecified)
{
sourceAddrLen = destSpecified ? message[npduStart + 7 + destAddrLen] : message[npduStart + 4];
npduLength = destSpecified ? 9 + destAddrLen + sourceAddrLen : 5 + sourceAddrLen;
}
}
return npduLength;
}