Comment obtenir les valeurs nécessaires de l'en-tête de ID3v2?
Question
J'essaie de lire l'en-tête de ID3v2 de fichiers MP3. Je peux obtenir / imprimer ID3 et vouloir imprimer "version" et "subversion" qui est de type char, mais je ne peux pas obtenir ce dont j'ai besoin.
Voici le code:
}
.....
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.
La solution
Vous ne devriez lire qu'une seule fois l'en-tête. c'est-à-dire si tu as
struct id3v2hdr {
char TAG[3];
unsigned char version;
unsigned char subversion;
...
}
Votre code serait:
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);
}
Notez que version
et subversion
sont des entiers de la taille d'un octet, pas des caractères imprimables, vous devez donc utiliser %hhu
(%hhd
s'ils sont signés) comme spécification de format.
De plus, le pointeur vers le premier élément d'une structure, et le pointeur vers une structure se comparent égaux, donc en modifiant votre fread
ligne à:
fread(&tag, 1, sizeof(tag),file); // tag is structure with elements of header
est inutile (difficile, cela montrerait l'intention beaucoup plus clairement).
Autres conseils
Lisez-vous suffisamment d'octets? Vous passez l'adresse de Tag.tag, mais fournissant la taille de la taille (TAG) et non la taille (tag.tag).
Ce serait %c
pour imprimer un char et non %s
(Utilisé pour l'impression char*
):
printf("ID3v2.%c.%c", tag.version, tag.subversion);
Utilisation %d
Si vous voulez voir l'octet comme un numéro.