code: public static CEMI create(final byte[] data, final int offset, final int length)
  		throws KNXFormatException
  	{
  		if (length < 1)
  			throw new KNXFormatException("buffer too short for cEMI frame", length);
  		final int mc = data[offset] & 0xff;
  		switch (mc) {
  		case CEMILData.MC_LDATA_REQ:
  		case CEMILData.MC_LDATA_CON:
  		case CEMILData.MC_LDATA_IND:
  			if (length < 26) {
  				try {
  					return new CEMILData(data, offset, length);
  				}
  				catch (final KNXFormatException e) {
  					// fall-through and try if the extended cEMI works
  				}
  			}
  			return new CEMILDataEx(data, offset, length);
  		case CEMIDevMgmt.MC_PROPREAD_REQ:
  		case CEMIDevMgmt.MC_PROPREAD_CON:
  		case CEMIDevMgmt.MC_PROPWRITE_REQ:
  		case CEMIDevMgmt.MC_PROPWRITE_CON:
  		case CEMIDevMgmt.MC_PROPINFO_IND:
  		case CEMIDevMgmt.MC_RESET_REQ:
  		case CEMIDevMgmt.MC_RESET_IND:
  			return new CEMIDevMgmt(data, offset, length);
  		case CEMIBusMon.MC_BUSMON_IND:
  			return new CEMIBusMon(data, offset, length);
  		default:
  			throw new KNXFormatException("unsupported cEMI msg code", mc);
  		}
  	}
docs: Creates a new cEMI message out of the given <code>data</code> byte stream.
  
  @param data byte stream containing a cEMI message frame structure
  @param offset start offset of cEMI message in <code>data</code>
  @param length length in bytes of the whole cEMI message in <code>data</code>
  @return the new created cEMI message
  @throws KNXFormatException if no (valid) cEMI structure was found or unsupported cEMI message
  code