/**
   * Compress DNS data.
   *
   * <p>see E.3 of the Wi-Fi Direct technical specification for the detail.
   *
   * @param dnsName dns name
   * @return compressed dns name
   */
  private static String compressDnsName(String dnsName) {
    StringBuffer sb = new StringBuffer();

    // The domain name is replaced with a pointer to a prior
    // occurrence of the same name in virtual memory packet.
    while (true) {
      String data = sVmPacket.get(dnsName);
      if (data != null) {
        sb.append(data);
        break;
      }
      int i = dnsName.indexOf('.');
      if (i == -1) {
        if (dnsName.length() > 0) {
          sb.append(String.format(Locale.US, "%02x", dnsName.length()));
          sb.append(WifiP2pServiceInfo.bin2HexStr(dnsName.getBytes()));
        }
        // for a sequence of labels ending in a zero octet
        sb.append("00");
        break;
      }

      String name = dnsName.substring(0, i);
      dnsName = dnsName.substring(i + 1);
      sb.append(String.format(Locale.US, "%02x", name.length()));
      sb.append(WifiP2pServiceInfo.bin2HexStr(name.getBytes()));
    }
    return sb.toString();
  }
  /**
   * Create wpa_supplicant service query for PTR record.
   *
   * @param instanceName instance name.<br>
   *     e.g) "MyPrinter"
   * @param serviceType service type.<br>
   *     e.g) "_ipp._tcp"
   * @return wpa_supplicant service query.
   */
  private static String createPtrServiceQuery(String instanceName, String serviceType) {

    StringBuffer sb = new StringBuffer();
    sb.append("bonjour ");
    sb.append(createRequest(serviceType + ".local.", DNS_TYPE_PTR, VERSION_1));
    sb.append(" ");

    byte[] data = instanceName.getBytes();
    sb.append(String.format(Locale.US, "%02x", data.length));
    sb.append(WifiP2pServiceInfo.bin2HexStr(data));
    // This is the start point of this response.
    // Therefore, it indicates the request domain name.
    sb.append("c027");
    return sb.toString();
  }