public static Packet<String> decodePacket(String data, boolean utf8decode) {
    int type;
    try {
      type = Character.getNumericValue(data.charAt(0));
    } catch (IndexOutOfBoundsException e) {
      type = -1;
    }

    if (utf8decode) {
      try {
        data = UTF8.decode(data);
      } catch (UTF8Exception e) {
        return err;
      }
    }

    if (type < 0 || type >= packetslist.size()) {
      return err;
    }

    if (data.length() > 1) {
      return new Packet<String>(packetslist.get(type), data.substring(1));
    } else {
      return new Packet<String>(packetslist.get(type));
    }
  }