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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top