code: private Object[] processByteArrayWithData(long rowOffset, long rowLength, List<String> columnNames) {
          Object[] rowElements;
          if (columnNames != null) {
              rowElements = new Object[columnNames.size()];
          } else {
              rowElements = new Object[(int) sasFileProperties.getColumnsCount()];
          }
          byte[] source;
          int offset;
          if (sasFileProperties.isCompressed() && rowLength < sasFileProperties.getRowLength()) {
              Decompressor decompressor = LITERALS_TO_DECOMPRESSOR.get(sasFileProperties.getCompressionMethod());
              source = decompressor.decompressRow((int) rowOffset, (int) rowLength,
                      (int) sasFileProperties.getRowLength(), cachedPage);
              offset = 0;
          } else {
              source = cachedPage;
              offset = (int) rowOffset;
          }
  
          for (int currentColumnIndex = 0; currentColumnIndex < sasFileProperties.getColumnsCount()
                  && columnsDataLength.get(currentColumnIndex) != 0; currentColumnIndex++) {
              if (columnNames == null) {
                  rowElements[currentColumnIndex] = processElement(source, offset, currentColumnIndex);
              } else {
                  String name = columns.get(currentColumnIndex).getName();
                  if (columnNames.contains(name)) {
                      rowElements[columnNames.indexOf(name)] = processElement(source, offset, currentColumnIndex);
                  }
              }
          }
  
          return rowElements;
      }
docs: The function to convert the array of bytes that stores the data of a row into an array of objects.
  Each object corresponds to a table cell.
  
  @param rowOffset   - the offset of the row in cachedPage.
  @param rowLength   - the length of the row.
  @param columnNames - list of column names which should be processed.
  @return the array of objects storing the data of the row.