public Pdu(byte[] recievedPdu)
        {
            int Type = recievedPdu[1];

            pduHeaderLen = (Type == 2 || Type == 3) ? 12 : 10;

            byte[] array = new byte[pduHeaderLen];
            Array.Copy(recievedPdu, 0, array, 0, pduHeaderLen);
            header = EndianessMarshaler.BytesToStruct <PDUHeader>(array);

            Param = new List <byte>();
            array = new byte[header.plen];
            Array.Copy(recievedPdu, pduHeaderLen, array, 0, header.plen);
            Param.AddRange(array);

            Data        = new List <byte>();
            array       = new byte[header.dlen];
            header.dlen = (ushort)Math.Min(header.dlen, recievedPdu.Length - pduHeaderLen - header.plen);//for OLD PLC: recievedPdu.Length = 400, header.dlen = 448

            Array.Copy(recievedPdu, pduHeaderLen + header.plen, array, 0, header.dlen);
            Data.AddRange(array);


            UData = new List <byte>();
            initUData();
        }
        public virtual byte[] ToBytes()
        {
            //Todo byteswap within the length of the pdu headers!
            header.plen = (ushort)Param.Count;
            header.dlen = (ushort)Data.Count;

            var retVal = new byte[pduHeaderLen + header.plen + header.dlen];

            byte[] bheader = EndianessMarshaler.StructToBytes <PDUHeader>(header);

            Array.Copy(bheader, 0, retVal, 0, pduHeaderLen);
            Array.Copy(Param.ToArray(), 0, retVal, pduHeaderLen, Param.Count);
            Array.Copy(Data.ToArray(), 0, retVal, pduHeaderLen + Param.Count, Data.Count);

            return(retVal);
        }
        public Pdu(byte[] recievedPdu)
        {
            int Type = recievedPdu[1];

            pduHeaderLen = (Type == 2 || Type == 3) ? 12 : 10;

            byte[] array = new byte[pduHeaderLen];
            Array.Copy(recievedPdu, 0, array, 0, pduHeaderLen);
            header = EndianessMarshaler.BytesToStruct <PDUHeader>(array);

            Param = new List <byte>();
            array = new byte[header.plen];
            Array.Copy(recievedPdu, pduHeaderLen, array, 0, header.plen);
            Param.AddRange(array);

            Data  = new List <byte>();
            array = new byte[header.dlen];
            Array.Copy(recievedPdu, pduHeaderLen + header.plen, array, 0, header.dlen);
            Data.AddRange(array);

            UData = new List <byte>();
        }