Come posso ottenere i valori necessari dell'intestazione di ID3v2?
Domanda
Sto cercando di leggere l'intestazione di ID3v2 dei file MP3. Posso ottenere/stampare ID3 e voglio stampare "versione" e "sovversione" che è tipo char, ma non riesco a ottenere ciò di cui ho bisogno.
Ecco il codice:
}
.....
fseek(file,0,SEEK_SET);
fread(&tag.TAG, 1, sizeof(tag),file); // tag is structure with elements of header
if(strncmp(tag.TAG,"ID3", 3) == 0)
{
fread(&tag.version,1, sizeof(tag),file);
fread(&tag.subversion,1, sizeof(tag),file);
printf("ID3v2.%s.%s", tag.version, tag.subversion);
}
}
UN.
Soluzione
Dovresti leggere solo una volta l'intestazione. cioè se hai
struct id3v2hdr {
char TAG[3];
unsigned char version;
unsigned char subversion;
...
}
Il tuo codice sarebbe:
fseek(file,0,SEEK_SET);
fread(&tag.TAG, 1, sizeof(tag),file); // tag is structure with elements of header
if(strncmp(tag.TAG,"ID3", 3) == 0)
{
printf("ID3v2.%hhd.%hhd", tag.version, tag.subversion);
}
Notare che version
e subversion
sono numeri interi delle dimensioni di byte, non caratteri stampabili, quindi dovresti usare %hhu
(%hhd
Se sono firmati) come specifica del formato.
Inoltre, il puntatore al primo elemento di una struttura e il puntatore a una struttura confronta uguali, quindi cambiando il tuo fread
linea a:
fread(&tag, 1, sizeof(tag),file); // tag is structure with elements of header
non è necessario (difficile mostrerebbe l'intento molto più chiaramente).
Altri suggerimenti
Stai leggendo abbastanza byte? Stai passando l'indirizzo di tag.tag, ma fornendo dimensione di (tag) e non sizeof (tag.tag).
Sarebbe %c
per stampare un carattere e no %s
(utilizzato per la stampa di terminazione null char*
):
printf("ID3v2.%c.%c", tag.version, tag.subversion);
Uso %d
Se vuoi vedere il byte come un numero.