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."); } }
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); }