Empezamos con la cabecera del archivo:
typedef struct
{
unsigned char magic[4]; // ID
unsigned char rfu000[4];
unsigned int label_ptr; // Pointer to Labels Section
unsigned int data_ptr; // Pointer to Data Section
unsigned int nsects; // Section Numbers
} PsfHdr;
nSects te dice cuantas secciones tiene el archivo, así que después de esta cabecera encuentras n veces esta estructura
typedef struct
{
unsigned short label_off;
unsigned char rfu001;
unsigned char data_type;
unsigned int datafield_used;
unsigned int datafield_size;
unsigned int data_off;
} PsfSec;
En la cabecera tienes la dirección de los label_ptr, que te indica la dirección dentro del archivo donde empieza el buffer de los Labels (tittle, tittleId, category, etc etc) y en data_ptr tienes la dirección donde están los datos.
Total, tienes que recorrer todas las secciones, ahí te dice cada una donde está su label y donde está su data, en data_Type te indica si es de tipo int, string .. y en datafield_size tienes el tamaño del buffer cuando es un string.
está facil ... no?