code: public static List<ZipExtraField> parse(byte[] data) throws ZipException {
      List<ZipExtraField> v = new ArrayList<ZipExtraField>();
      if (data == null) {
        return v;
      }
      int start = 0;
      while (start <= data.length - WORD) {
        ZipShort headerId = new ZipShort(data, start);
        int length = (new ZipShort(data, start + 2)).getValue();
        if (start + WORD + length > data.length) {
          throw new ZipException("bad extra field starting at "
              + start + ".  Block length of "
              + length + " bytes exceeds remaining"
              + " data of "
              + (data.length - start - WORD)
              + " bytes.");
        }
        try {
          ZipExtraField ze = createExtraField(headerId);
          ze.parseFromLocalFileData(data, start + WORD, length);
          v.add(ze);
        }
        catch (InstantiationException ie) {
          throw new ZipException(ie.getMessage());
        }
        catch (IllegalAccessException iae) {
          throw new ZipException(iae.getMessage());
        }
        start += (length + WORD);
      }
      return v;
    }
docs: Split the array into ExtraFields and populate them with the
  given data as local file data, throwing an exception if the
  data cannot be parsed.
  
  @param data an array of bytes as it appears in local file data
  @return an array of ExtraFields
  @throws ZipException on error