Check the definition of the t_fingerprint structure in common.h:
/*
fingerprint storage
*/
struct t_fingerprint
{
/*
fingerprint version
*/
short version;
/*
length in centiseconds
*/
int length;
/*
average line fit, times 1000
*/
short avg_fit;
/*
average dominant line, times 100
*/
short avg_dom;
/*
spectral fits, 4 bits times 16 bands = 32 times 87 frames
-> 348 bytes
*/
unsigned char r[348];
/*
spectral doms, 6 bits times 87 frames = 65.25
*/
unsigned char dom[66];
};
The content of this structure is packed into a byte array in fp_calculate function in fooid.c:
memcpy(buff, &(fi->fp.version), sizeof(short));
buff += sizeof(short);
memcpy(buff, &(fi->fp.length), sizeof(int));
buff += sizeof(int);
memcpy(buff, &(fi->fp.avg_fit), sizeof(short));
buff += sizeof(short);
memcpy(buff, &(fi->fp.avg_dom), sizeof(short));
buff += sizeof(short);
memcpy(buff, &(fi->fp.r), sizeof(unsigned char) * 348);
buff += sizeof(unsigned char) * 348;
memcpy(buff, &(fi->fp.dom), sizeof(unsigned char) * 66);
buff += sizeof(unsigned char) * 66;
As you can see different parts of the fingerprint contain different values. If you need more details about the algorithm, you could try to contact Garf. Since he developed FooID during his time at university, he might have written a paper about it.