Как получить необходимые значения заголовка ID3v2? - PullRequest
0 голосов
/ 16 июня 2011

Я пытаюсь прочитать заголовок ID3V2 mp3-файлов. Я могу получить / напечатать ID3 и хочу распечатать «версию» и «подрывную деятельность», которая имеет тип char, но я не могу получить то, что мне нужно.

вот код:

    }
    .....
    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);
   }
}

A.

Ответы [ 3 ]

0 голосов
/ 16 июня 2011

Это будет %c для печати символа, а не %s (используется для печати с нулевым символом char*):

printf("ID3v2.%c.%c", tag.version, tag.subversion);

Используйте %d, если вы хотите увидеть байткак число.

0 голосов
/ 17 июня 2011

Вы должны прочитать только один раз заголовок.т. е. если у вас есть

struct id3v2hdr {
    char TAG[3];
    unsigned char version;
    unsigned char subversion;
    ...
}

Ваш код будет:

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);
}

Обратите внимание, что version и subversion являются целыми байтами, а не печатными символами, поэтому вам следует использовать%hhu (%hhd, если они подписаны) в качестве его спецификации формата.

Кроме того, указатель на первый элемент структуры и указатель на структуру сравниваются, поэтому изменив свой freadстрока:

fread(&tag, 1, sizeof(tag),file); // tag is structure with elements of header

не нужна (хотя это гораздо яснее продемонстрирует намерение).

0 голосов
/ 16 июня 2011

Вы читаете достаточно байтов? Вы передаете адрес tag.TAG, но предоставляете sizeof (tag), а не sizeof (tag.TAG).

...