code: public static byte[][] split(byte[] source, byte[] separator, int limit) {
      List<Range> segments = splitRanges(source, separator, limit);
  
      byte[][] splits = new byte[segments.size()][];
      for (int i = 0; i < segments.size(); i++) {
        Range r = segments.get(i);
        byte[] tmp = new byte[r.length()];
        if (tmp.length > 0) {
          System.arraycopy(source, r.start(), tmp, 0, r.length());
        }
        splits[i] = tmp;
      }
      return splits;
    }
docs: Splits the source array into multiple array segments using the given
  separator, up to a maximum of count items. This will naturally produce
  copied byte arrays for each of the split segments. To identify the split
  ranges without the array copies, see
  {@link ByteUtil#splitRanges(byte[], byte[])}.
  
  @param source
  @param separator
  @return