code: private static String readName(
              byte data[],
              int offset,
              HashSet<Integer> jumps
      ) throws IOException {
          int c = data[offset] & 0xff;
          if ((c & 0xc0) == 0xc0) {
              c = ((c & 0x3f) << 8) + (data[offset + 1] & 0xff);
              if (jumps.contains(c)) {
                  throw new DnsException("", "Cyclic offsets detected.");
              }
              jumps.add(c);
              return readName(data, c, jumps);
          }
          if (c == 0) {
              return "";
          }
          String s = new String(data, offset + 1, c);
          String t = readName(data, offset + 1 + c, jumps);
          if (t.length() > 0) {
              s = s + "." + t;
          }
          return s;
      }
docs: Parse a domain name starting at the given offset.
  
  @param data   The raw data.
  @param offset The offset.
  @param jumps  The list of jumps (by now).
  @return The parsed domain name.
  @throws IOException on cycles.