c - 如何获取 ID3v2 标头的必要值

  • 本文关键字:ID3v2 何获取 获取 mp3 id3v2
  • 更新时间 :
  • 英文 :


我正在尝试读取mp3文件的ID3V2的标头。我可以获取/打印ID3,并想打印出字符类型的"版本"和"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)
    {
        fread(&tag.version,1, sizeof(tag),file);
        fread(&tag.subversion,1, sizeof(tag),file);
    printf("ID3v2.%s.%s", tag.version, tag.subversion);
   }
}

一个。

您应该只读取一次标题。 即如果你有

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

请注意,versionsubversion 是字节大小的整数,而不是可打印的字符,因此您应该使用 %hhu(如果它们有符号,则%hhd(作为其格式规范。

此外,指向结构的第一个元素的指针和指向结构的指针比较相等,因此将fread行更改为:

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

是不必要的(很难,它会更清楚地显示意图(。

你读取的字节数是否足够?您正在传递标记的地址。TAG,但提供 sizeof(tag( 而不是 sizeof(tag。标记(。

这对于

打印字符而不是%s %c(用于打印以 null 结尾的 char* (:

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

如果要将字节视为数字,请使用%d

最新更新