Your first problem is the use of available(). All it does is tell you how much data is available to be read without blocking, which is rarely of much interest, and there is a specific warning in the Javadoc against treating it as the length of the entire input. What you're really interested in is how much data you need.
Fortunately there is an easy solution. Wrap the input stream in a DataInputStream,
and read it as follows:
short crc16 = in.readShort();
// check the CRC
String hexString = "0x"+(Integer.toString(in.readInt(), 16));
// ...
etc. See the Javadoc.
skip(0)
does nothing in your code, as that's where you already are when you open the file.
I don't know what you mean by 'read it upside down'.