public VIFE_FB(byte b)
        {
            var record = VIFE_FB
                         .VifeFbTable
                         .ToDictionary(x => x.VIFFB)[(byte)(b & (byte)VariableDataRecordType.MBUS_DIB_VIF_WITHOUT_EXTENSION)]; // clear Extension bit

            Data      = b;
            Extension = (b & 0x80) != 0;
            Units     = record.Units;
            Unit      = record.Unit;
            Quantity  = record.Quantity;
            Magnitude = record.Magnitude(b);
            Prefix    = UnitPrefix.GetUnitPrefix(record.Magnitude(b));
        }
        public VIFE_FD(byte data)
        {
            var record = VIFE_FD
                         .VifeFdTable
                         .ToDictionary(x => x.VIFFE)[(byte)(data & (byte)VariableDataRecordType.MBUS_DIB_VIF_WITHOUT_EXTENSION)]; // clear Extension bit

            Data      = data;
            Extension = (data & 0x80) != 0;
            Units     = record.Units;
            Unit      = record.Unit;
            Quantity  = record.Quantity;
            Magnitude = record.Magnitude(data);
            Prefix    = UnitPrefix.GetUnitPrefix(record.Magnitude(data));
        }
        public VIFE(byte data)
        {
            Data      = data;
            Extension = (data & 0x80) != 0;

            data &= (byte)VariableDataRecordType.MBUS_DIB_VIF_WITHOUT_EXTENSION; // clear Extension bit

            if ((data >= 0) && (data <= 0x1f))
            {
                Units     = VariableDataQuantityUnit.ErrorCodesVIFE;
                Magnitude = (data & 0x1f);
            }
            else if (data == 0x20)
            {
                Units = VariableDataQuantityUnit.Per_second;
            }
            else if (data == 0x21)
            {
                Units = VariableDataQuantityUnit.Per_minute;
            }
            else if (data == 0x22)
            {
                Units = VariableDataQuantityUnit.Per_hour;
            }
            else if (data == 0x23)
            {
                Units = VariableDataQuantityUnit.Per_day;
            }
            else if (data == 0x24)
            {
                Units = VariableDataQuantityUnit.Per_week;
            }
            else if (data == 0x25)
            {
                Units = VariableDataQuantityUnit.Per_month;
            }
            else if (data == 0x26)
            {
                Units = VariableDataQuantityUnit.Per_year;
            }
            else if (data == 0x27)
            {
                Units = VariableDataQuantityUnit.Per_RevolutionMeasurement;
            }
            else if (data == 0x28)
            {
                Units = VariableDataQuantityUnit.Increment_per_inputPulseOnInputChannel0;
            }
            else if (data == 0x29)
            {
                Units = VariableDataQuantityUnit.Increment_per_inputPulseOnInputChannel1;
            }
            else if (data == 0x2a)
            {
                Units = VariableDataQuantityUnit.Increment_per_outputPulseOnOutputChannel0;
            }
            else if (data == 0x2b)
            {
                Units = VariableDataQuantityUnit.Increment_per_outputPulseOnOutputChannel1;
            }
            else if (data == 0x2c)
            {
                Units = VariableDataQuantityUnit.Per_liter;
            }
            else if (data == 0x2d)
            {
                Units = VariableDataQuantityUnit.Per_m3;
            }
            else if (data == 0x2e)
            {
                Units = VariableDataQuantityUnit.Per_kg;
            }
            else if (data == 0x2f)
            {
                Units = VariableDataQuantityUnit.Per_Kelvin;
            }
            else if (data == 0x30)
            {
                Units = VariableDataQuantityUnit.Per_kWh;
            }
            else if (data == 0x31)
            {
                Units = VariableDataQuantityUnit.Per_GJ;
            }
            else if (data == 0x32)
            {
                Units = VariableDataQuantityUnit.Per_kW;
            }
            else if (data == 0x33)
            {
                Units = VariableDataQuantityUnit.Per_KelvinLiter;
            }
            else if (data == 0x34)
            {
                Units = VariableDataQuantityUnit.Per_Volt;
            }
            else if (data == 0x35)
            {
                Units = VariableDataQuantityUnit.Per_Ampere;
            }
            else if (data == 0x36)
            {
                Units = VariableDataQuantityUnit.MultipliedBySek;
            }
            else if (data == 0x37)
            {
                Units = VariableDataQuantityUnit.MultipliedBySek_per_V;
            }
            else if (data == 0x38)
            {
                Units = VariableDataQuantityUnit.MultipliedBySek_per_A;
            }
            else if (data == 0x39)
            {
                Units = VariableDataQuantityUnit.StartDateTimeOf;
            }
            else if (data == 0x3a)
            {
                Units = VariableDataQuantityUnit.UncorrectedUnit;
            }
            else if (data == 0x3b)
            {
                Units = VariableDataQuantityUnit.AccumulationPositive;
            }
            else if (data == 0x3c)
            {
                Units = VariableDataQuantityUnit.AccumulationNegative;
            }
            else if ((data >= 0x3d) && (data <= 0x3f))
            {
                Units     = VariableDataQuantityUnit.ReservedVIFE_3D;
                Magnitude = (data - 0x3d);
            }
            else if ((data == 0x40) || (data == 0x48))
            {
                Units     = VariableDataQuantityUnit.LimitValue;
                Magnitude = ((data & 0x08) >> 3);
            }
            else if ((data == 0x41) || (data == 0x49))
            {
                Units     = VariableDataQuantityUnit.NrOfLimitExceeds;
                Magnitude = ((data & 0x08) >> 3);
            }
            else if ((data & 0x72) == 0x42)
            {
                Units     = VariableDataQuantityUnit.DateTimeOfLimitExceed;
                Magnitude = (data & 0x0d);
            }
            else if ((data >= 0x50) && (data <= 0x5f))
            {
                Units     = VariableDataQuantityUnit.DurationOfLimitExceed;
                Magnitude = (data & 0x0f);
            }
            else if ((data >= 0x60) && (data <= 0x67))
            {
                Units     = VariableDataQuantityUnit.DurationOfLimitAbove;
                Magnitude = (data & 0x07);
            }
            else if ((data & 0x7a) == 0x68)
            {
                Units     = VariableDataQuantityUnit.ReservedVIFE_68;
                Magnitude = (data - 0x05);
            }
            else if ((data & 0x7a) == 0x6a)
            {
                Units     = VariableDataQuantityUnit.DateTimeOfLimitAbove;
                Magnitude = (data & 0x05);
            }
            else if ((data >= 0x70) && (data <= 0x77))
            {
                Units     = VariableDataQuantityUnit.MultiplicativeCorrectionFactor;
                Magnitude = (data & 0x07) - 6;
            }
            else if ((data >= 0x78) && (data <= 0x7b))
            {
                Units     = VariableDataQuantityUnit.AdditiveCorrectionConstant;
                Magnitude = (data & 0x03) - 3;
            }
            else if (data == 0x7c)
            {
                Units = VariableDataQuantityUnit.ReservedVIFE_7C;
            }
            else if (data == 0x7d)
            {
                Units     = VariableDataQuantityUnit.MultiplicativeCorrectionFactor1000;
                Magnitude = 3;
            }
            else if (data == 0x7e)
            {
                Units = VariableDataQuantityUnit.ReservedVIFE_7E;
            }
            else if (data == 0x7f)
            {
                Units = VariableDataQuantityUnit.ManufacturerSpecific;
            }
            else
            {
                throw new InvalidDataException();
            }

            Prefix = UnitPrefix.GetUnitPrefix(Magnitude);
        }