¿Cómo obtengo los valores necesarios de encabezado de ID3V2?
Pregunta
Estoy tratando de leer el encabezado de ID3v2 de los archivos MP3. Puedo obtener/imprimir id3 y quiero imprimir "versión" y "subversión", que es tipo char, pero no puedo obtener lo que necesito.
Aquí está el código:
}
.....
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);
}
}
UNA.
Solución
Deberías leer solo una vez el encabezado. es decir, si tienes
struct id3v2hdr {
char TAG[3];
unsigned char version;
unsigned char subversion;
...
}
Su código sería:
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);
}
Tenga en cuenta que version
y subversion
son enteros del tamaño de bytes, no caracteres imprimibles, por lo que debe usar %hhu
(%hhd
si se firman) como su especificación de formato.
Además, el puntero al primer elemento de una estructura, y el puntero a una estructura compare igual, por lo que cambiar su fread
línea a:
fread(&tag, 1, sizeof(tag),file); // tag is structure with elements of header
es innecesario (difícil, mostraría la intención mucho más claramente).
Otros consejos
¿Estás leyendo suficientes bytes? Está pasando la dirección de tag.tag, pero suministrando sizeOf (etiqueta) y no sizeOf (tag.tag).
Eso sería %c
para imprimir un char y no %s
(Se utiliza para imprimir nulas char*
):
printf("ID3v2.%c.%c", tag.version, tag.subversion);
Usar %d
Si quieres ver el byte como un número.