public TPDUConnection(byte[] packet)
        {
            int pos;
            int li = packet[0];

            TPDU.TPDU_TYPES type = (TPDU.TPDU_TYPES)(packet[1] >> 4);

            if ((type != TPDU.TPDU_TYPES.CR) && (type != TPDU.TPDU_TYPES.CC))
            {
                throw new ApplicationException("TPDU: This can only handle CC/CR TDPUs");
            }

            if (BitConverter.IsLittleEndian)
            {
                DstRef = ByteConvert.DoReverseEndian(BitConverter.ToUInt16(packet, 2));
                SrcRef = ByteConvert.DoReverseEndian(BitConverter.ToUInt16(packet, 4));
            }
            else
            {
                DstRef = BitConverter.ToUInt16(packet, 2);
                SrcRef = BitConverter.ToUInt16(packet, 4);
            }

            ClassOption = ((packet[6] & 0xf0) >> 4);
            if (ClassOption > 4)
            {
                throw new Exception("TPDU: Class option number not allowed.");
            }

            pos = 7;
            // read variable part
            Varpart = new ArrayList();
            try
            {
                while (pos < li)
                {
                    VarParam vp = new VarParam();
                    vp.code   = packet[pos];
                    pos      += 1;
                    vp.length = packet[pos];
                    pos      += 1;
                    vp.value  = new byte[vp.length];
                    Array.Copy(packet, pos, vp.value, 0, vp.length);
                    pos += vp.length;
                    Varpart.Add(vp);
                }
            }
            catch (Exception)
            {
                throw new Exception("TPDU: Error parsing variable part of CR/CC PDU.");
            }
        }
Example #2
0
        public TPDUData(byte[] packet, int packetLen)
        {
            if (packetLen < DT_HLEN)
            {
                throw new Exception("TPDU: DT packet size lower than minimum of 3 bytes.");
            }

            int li = packet[0];

            TPDU.TPDU_TYPES type = (TPDU.TPDU_TYPES)(packet[1] >> 4);

            if (type != TPDU.TPDU_TYPES.DT)
            {
                throw new ApplicationException("TPDU: This can only handle DT TDPUs");
            }

            if (li != HLEN_LI_NORMAL_DT_CLASS_01)
            {
                throw new Exception("TPDU: Header length indicator in DT packet other than 2 in class 0/1 PDUs are not allowed.");
            }

            TPDUNr = (packet[2] & 0x7f);

            if ((packet[2] & 0x80) != 0)
            {
                EOT = true;
            }
            else
            {
                EOT = false;
            }

            PayloadLength = packetLen - DT_HLEN;
            Payload       = new byte[PayloadLength];
            Array.Copy(packet, DT_HLEN, Payload, 0, PayloadLength);
        }