public C_Message(String raw) {
    super(raw);
    logger.fine(" *** C-Message ***");
    String[] tokens = this.getPayload().split(Message.DELIMETER);

    rfAddress = tokens[0];

    byte[] bytes = Base64.decodeBase64(tokens[1].getBytes());

    int[] data = new int[bytes.length];

    for (int i = 0; i < bytes.length; i++) {
      data[i] = bytes[i] & 0xFF;
    }

    length = data[0];
    if (length != data.length - 1) {
      logger.fine(
          "C_Message malformed: wrong data length. Expected bytes "
              + length
              + ", actual bytes "
              + (data.length - 1));
    }

    String rfAddress2 = Utils.toHex(data[1], data[2], data[3]);
    if (!rfAddress.toUpperCase().equals(rfAddress2.toUpperCase())) {
      logger.fine(
          "C_Message malformed: wrong RF address. Expected address "
              + rfAddress.toUpperCase()
              + ", actual address "
              + rfAddress2.toUpperCase());
    }

    deviceType = DeviceType.create(data[4]);

    serialNumber = getSerialNumber(bytes);
    if (deviceType == DeviceType.HeatingThermostatPlus
        || deviceType == DeviceType.HeatingThermostat
        || deviceType == DeviceType.WallMountedThermostat) parseHeatingThermostatData(bytes);
    if (deviceType == DeviceType.EcoSwitch || deviceType == DeviceType.ShutterContact)
      logger.finer(
          "Device " + rfAddress + " type " + deviceType.toString() + " Data:" + parseData(bytes));
  }