You could also try reading the file more carefully, a field at a time, and extracting the bits manually.
This is totally untested so you may need to fix some things.
Code:
#include <stdint.h> // compile as -std=c99
float latitude, longitude;
uint16_t altitude;
fread(&latitude, sizeof latitude, 1, file);
fread(&longitude, sizeof longitude, 1, file);
fread(&altitude, sizeof altitude, 1, file); // print like printf("%d\n", (int)altitude);
char name[6];
fread(name, sizeof name - 1, 1, file);
name[sizeof name - 1] = '\0';
uint8_t b0;
fread(&b0, sizeof b0, 1, file);
int id = b0 & 0x03;
int category = (b0 >> 2) & 0x03;
int engaged = (b0 >> 4) & 0x01;
int res1 = (b0 >> 5);
char reported[7];
fread(reported, sizeof reported - 1, 1, file);
name[sizeof reported - 1] = '\0';
uint16_t w0, w1, w2;
fread(&w0, sizeof w0, 1, file);
fread(&w1, sizeof w1, 1, file);
fread(&w2, sizeof w2, 1, file);
int year = w0 & 0x7f;
int month = (w0 >> 7) & 0x0f;
int day = (w0 >> 11);
int hour = w1 & 0x1f;
int minute = (w1 >> 5) & 0x3f;
int res2 = (w1 >> 11);
int second = w2 & 0x3f;
int res3 = (w2 >> 6);
It's also possible that w0, w1, and w2 should be read in the opposite order:
Code:
fread(&w2, sizeof w2, 1, file);
fread(&w1, sizeof w1, 1, file);
fread(&w0, sizeof w0, 1, file);