I want to convert a C code to Java. It reads a binary file:
int main(int argc, char**argv)
{
FILE *fd;
unsigned long trameNumber = 0;
unsigned long long INDEX;
fd = fopen(argv[1],"rb");
if (fd == NULL)
{
printf("Usage %s [File]\n", argv[0]);
exit(1);
}
fread(&INDEX, sizeof(INDEX),1, fd);
printf("INDEX %llx\n",INDEX);
trameNumber++;
while (fread(&INDEX, sizeof(INDEX),1, fd) != 0)
{
printf("INDEX %llx\n",INDEX);
trameNumber++;
}
fclose(fd);
printf("%lu", trameNumber);
return 0;
}
The output with this code looks like:
INDEX 0
INDEX 9800000000000000
INDEX 1801000000000000
INDEX 5001000000000000
INDEX b801000000000000
Here is my Java code. I've tried to do that with BigInteger
:
public static final int DATA_BYTE_LENGHT = 8;
public void readBinary(final String readFilePath)
{
// A 8 byte buffer = 64 bits
ByteBuffer byteBuffer = ByteBuffer.allocate(DATA_BYTE_LENGHT);
// Those channels will be used to read/write files
FileChannel channelFileInput = null;
BigInteger bigIndex = null;
try {
// File to read
final File fileRead = new File(readFilePath);
// Channel used to read the file.
channelFileInput = new FileInputStream(fileRead).getChannel();
byteBuffer.put(new byte[DATA_BYTE_LENGHT]);
byteBuffer.rewind();
// While the file has content
while( channelFileInput.read(byteBuffer) != -1 ) {
byteBuffer.rewind();
// Big integer positive
bigIndex = new BigInteger(1, byteBuffer.array());
byteBuffer.rewind();
System.out.println("INDEX "+bigIndex.toString(16));
// Clear the buffer
byteBuffer.put(new byte[DATA_BYTE_LENGHT]);
byteBuffer.rewind();
}
} catch(FileNotFoundException e) {
System.err.println("The file cannot be read: "+e.getMessage());
} catch(Exception e) {
System.err.println(e.getMessage());
} finally {
// Close file connections
IOUtils.closeQuietly(channelFileInput);
}
}
However, read()
doesn't seem to read the file correctly. Because the output is:
INDEX 0
INDEX 98
INDEX 118
INDEX 150
INDEX 1b8
Could it be an endianess problem? How to solve it?
Thanks