code: def DecodePacket(self, packet):
          
  
          try:
              (self.code, self.id, length, self.authenticator) = \
                      struct.unpack('!BBH16s', packet[0:20])
          except struct.error:
              raise PacketError('Packet header is corrupt')
          if len(packet) != length:
              raise PacketError('Packet has invalid length')
          if length > 8192:
              raise PacketError('Packet length is too long (%d)' % length)
  
          self.clear()
  
          packet = packet[20:]
          while packet:
              try:
                  (key, attrlen) = struct.unpack('!BB', packet[0:2])
              except struct.error:
                  raise PacketError('Attribute header is corrupt')
  
              if attrlen < 2:
                  raise PacketError(
                          'Attribute length is too small (%d)' % attrlen)
  
              value = packet[2:attrlen]
              if key == 26:
                  # 26 is the Vendor-Specific attribute
                  (vendor, subattrs) = self._PktDecodeVendorAttribute(value)
                  if vendor is None:
                      self.setdefault(key, []).append(value)
                  else:
                      for (k, v) in subattrs:
                          self.setdefault((vendor, k), []).append(v)
              else:
                  self.setdefault(key, []).append(value)
  
              packet = packet[attrlen:]
docs: Initialize the object from raw packet data.  Decode a packet as
          received from the network and decode it.
  
          :param packet: raw packet
          :type packet:  string