/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.jlab.hipo.io;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
*
* @author gavalian
*/
public class HipoRecordHeader {
public static final int RECORD_HEADER_SIZE = 40;
public static final byte[] RECORD_IDENTIFIER_STRING = new byte[]{'H','R','E','C'};
public static final int RECORD_IDENTIFIER_INTEGER = 0x43455248; // INTEGER REPRESENTING STRING 'HREC'
/**
* Define offsets for each WORD in the header
*/
public static final int OFFSET_RECORD_LENGTH_WORD = 4;
public static final int OFFSET_DATA_LENGTH_WORD_UNCOMPRESSED = 8;
public static final int OFFSET_DATA_LENGTH_WORD_COMPRESSED = 12;
public static final int OFFSET_NUMBER_OF_EVENTS = 16;
public static final int OFFSET_HEADER_LENGTH_WORD = 20;
public static final int OFFSET_INDEX_LENGTH_WORD = 24;
ByteBuffer recordHeaderBuffer = null;
private long positionInFile = 0;
public HipoRecordHeader(){
byte[] headerBytes = new byte[HipoRecordHeader.RECORD_HEADER_SIZE];
recordHeaderBuffer = ByteBuffer.wrap(headerBytes);
recordHeaderBuffer.order(ByteOrder.LITTLE_ENDIAN);
for(int i = 0; i < 4; i++) recordHeaderBuffer.put(i, HipoRecordHeader.RECORD_IDENTIFIER_STRING[i]);
reset();
}
public HipoRecordHeader(byte[] array){
initBinary(array);
}
public final void initBinary(byte[] array){
recordHeaderBuffer = ByteBuffer.wrap(array);
recordHeaderBuffer.order(ByteOrder.LITTLE_ENDIAN);
/*System.out.println(String.format(" FIRST BYTE = %X %X ",
recordHeaderBuffer.getInt(0),
recordHeaderBuffer.getInt(0)&0x4FFFFFFF));*/
}
public final boolean isValid(){
int magicWord = recordHeaderBuffer.getInt(0);
return (magicWord&0x4FFFFFFF)==HipoRecordHeader.RECORD_IDENTIFIER_INTEGER;
}
public int getDataSize(){
return recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_UNCOMPRESSED);
}
public int getDataSizeCompressed(){
int result = recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_COMPRESSED);
int size = HipoByteUtils.getInteger(result, 0,23);
return size;
}
public int getRecordHeaderLength(){
return HipoRecordHeader.RECORD_HEADER_SIZE;
}
public int getNumberOfEvents(){
return recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_NUMBER_OF_EVENTS);
}
public int getRecordSize(){
return recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_RECORD_LENGTH_WORD);
}
public int getHeaderSize(){
return recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_HEADER_LENGTH_WORD);
}
public final int getIndexArraySize(){
int result = recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_INDEX_LENGTH_WORD);
int size = HipoByteUtils.getInteger(result, 0, 23);
return size;
}
public int getCompressionType(){
int result = recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_COMPRESSED);
int type = HipoByteUtils.getInteger(result, 24,30);
return type;
}
public byte[] getRecordHeaderData(){
return recordHeaderBuffer.array();
}
public long getPositionInFile(){
return this.positionInFile;
}
/* Setter functions */
public void setPositionInFile(long pos){
this.positionInFile = pos;
}
public final void setDataSize(int size){
int result = recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_UNCOMPRESSED);
result = HipoByteUtils.write(result, size, 0, 23);
recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_UNCOMPRESSED, result);
}
public final void setDataSizeCompressed(int size){
int result = recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_COMPRESSED);
result = HipoByteUtils.write(result, size, 0, 23);
recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_COMPRESSED, result);
}
public final void setIndexArraySize(int size){
int result = recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_INDEX_LENGTH_WORD);
result = HipoByteUtils.write(result, size, 0, 23);
recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_INDEX_LENGTH_WORD, result);
}
public final void setRecordHeaderLength(int length){
recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_RECORD_LENGTH_WORD, length);
}
public final void setNumberOfEvents(int nevents){
recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_NUMBER_OF_EVENTS, nevents);
}
public final void setHeaderSize(int size){
this.recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_HEADER_LENGTH_WORD, size);
}
public void setCompressionType(int type){
int result = recordHeaderBuffer.getInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_COMPRESSED);
result = HipoByteUtils.write(result, type, 24, 30);
recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_DATA_LENGTH_WORD_COMPRESSED, result);
}
public void setRecordSize(int size){
recordHeaderBuffer.putInt(HipoRecordHeader.OFFSET_RECORD_LENGTH_WORD,size);
}
@Override
public String toString(){
StringBuilder str = new StringBuilder();
str.append("RECORD : ");
str.append(String.format("SIZE = %8d, # EVENTS = %9d, DATA SIZE (COMP) = (%8d , %8d), HEADER %8d, TYPE = %2d, INDEX SIZE %8d, POS = %12d",
getRecordSize(),
this.getNumberOfEvents(),
this.getDataSize(), this.getDataSizeCompressed(), this.getHeaderSize(),
this.getCompressionType(),this.getIndexArraySize(),this.getPositionInFile()));
return str.toString();
}
public final void reset(){
setDataSize(0);
setDataSizeCompressed(0);
setHeaderSize(0);
setNumberOfEvents(0);
setIndexArraySize(0);
setRecordHeaderLength(0);
}
public static void main(String[] args){
HipoRecordHeader header = new HipoRecordHeader();
header.setRecordHeaderLength(819);
header.setDataSize(40);
header.setHeaderSize(120);
System.out.println(header);
System.out.println("Magic = " + header.isValid());
}
}
Ads help maintain this website.