/** * Read the values from the source records. * * @param recordBb * @param dgBlock * @param cgBlock * @param cnBlock * @return * @throws IOException */ public static ByteBuffer readNumberValues( ByteBuffer recordBb, DGBLOCK dgBlock, CGBLOCK cgBlock, CNBLOCK cnBlock) throws IOException { // put pointer to start of record area recordBb.rewind(); // allocate target buffer (byte) int targetValueSize = cnBlock.getNumberOfBits() / 8; if (cnBlock.getNumberOfBits() % 8 != 0) { targetValueSize++; } int numberOfTotalBytes = (int) (targetValueSize * cgBlock.getNoOfRecords()); ByteBuffer target = ByteBuffer.allocate(numberOfTotalBytes); // iterate over records for (int i = 0; i < cgBlock.getNoOfRecords(); i++) { // read record int recordIdOffset = (dgBlock.getNoRecordIds() > 0) ? 1 : 0; byte[] record = new byte[cgBlock.getDataRecordSize() + recordIdOffset]; recordBb.get(record); // skip first bits and read value BitInputStream bis = new BitInputStream(record); int skipBits = (recordIdOffset * 8) + (cnBlock.getByteOffset() * 8) + cnBlock.getNumberOfFirstBits(); bis.skip(skipBits); byte[] b = bis.readByteArray(cnBlock.getNumberOfBits()); // add to buffer target.put(b); } target.rewind(); return target; }
/** * @param recordBb * @param dgBlock * @param cgBlock * @param cnBlock * @return * @throws IOException */ public static ByteBuffer readStringValues( ByteBuffer recordBb, DGBLOCK dgBlock, CGBLOCK cgBlock, CNBLOCK cnBlock) throws IOException { // put pointer to start of record area recordBb.rewind(); byte[] target = new byte[0]; // iterate over records for (int i = 0; i < cgBlock.getNoOfRecords(); i++) { // read record int recordIdOffset = (dgBlock.getNoRecordIds() > 0) ? 1 : 0; byte[] record = new byte[cgBlock.getDataRecordSize() + recordIdOffset]; recordBb.get(record); // skip first bits and read value BitInputStream bis = new BitInputStream(record); int skipBits = (recordIdOffset * 8) + (cnBlock.getByteOffset() * 8) + cnBlock.getNumberOfFirstBits(); bis.skip(skipBits); byte[] b = bis.readByteArray(cnBlock.getNumberOfBits()); // build string value and append StringBuffer sb = new StringBuffer(); sb.append(Mdf3Util.readChars(ByteBuffer.wrap(b), b.length)); sb.append((char) '\0'); // add to target byte[] src = sb.toString().getBytes(); byte[] dest = new byte[target.length + src.length]; System.arraycopy(target, 0, dest, 0, target.length); System.arraycopy(src, 0, dest, target.length, src.length); target = dest; } return ByteBuffer.wrap(target); }