Reading With Preon
A... what?
Preon is a Java library which aims to provide a framework for dealing with binary encoded data. Repository
Actually reading binary files in Java isn't very comfortable. I love a python way to deal with binary files - struct
import struct
#How exemplary data is packed
format = "<IIH2s"
#How long it is
how_many_bytes = calcsize(format)
#unpacking
something = struct.unpack(format, string_with_binary_data)
#packing
packed = pack('llh0l', 1, 2, 3)
Nice and clean. What about Java? There are many ways to read binary files with Java. Almost all are very tedious. I decided to use preon. Here and there you can read some publications about preon.
How to use preon?
I think that from user point of view, the most important part of preon library are codecs.
//Create codec based on previously defined class
Codec<EXTHHeader> codec = Codecs.create(EXTHHeader.class);
//Create buffer with data to be read
RandomAccessFile fp = new RandomAccessFile(file, "r");
fp.seek(offset);
byte[] buff= new byte[headers.size];
fp.read(buff, 0, headers.exthHeaderSize);
//Decode your object from buffer
EXTHHeader exthHeader = Codecs.decode(codec, buff);
import nl.flotsam.preon.annotation.BoundNumber;
//There is something like big and little endian (default is little)
import nl.flotsam.preon.buffer.ByteOrder;
public class EXTHHeader {
//I use long with size 32 to represent unsigned 32 bit int
//Reading signed int is identical except from using int instead of long
@BoundNumber(size="32", byteOrder=ByteOrder.BigEndian)
long identifier;
@BoundNumber(size="32", byteOrder=ByteOrder.BigEndian)
long headerLength;
@BoundNumber(size="32", byteOrder=ByteOrder.BigEndian)
long recordCount;
@Override
public String toString() {
return "EXTHHeader [identifier=" + identifier + ", headerLength="
+ headerLength + ", recordCount=" + recordCount + "]";
}
}
You can define byte order, size, type... and even lists with size based on value from one of fields. You can also add different methods to class (like toString).
I forgot to mention, Preon has lots of dependencies, you have to include them in your project or it won't work.
Not so hard, isn't it? And it has lot's more functionalities, but those above are the most common ones.