【问题标题】:how do I get necessary values of header of ID3v2?如何获得 ID3v2 标头的必要值?
【发布时间】:2011-06-16 18:47:55
【问题描述】:

我正在尝试读取 mp3 文件的 ID3V2 标头。我可以获取/打印 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);
   }
}

一个。

【问题讨论】:

  • 为什么要删除格式?
  • 你为什么读sizeof(tag)字节? fread 调用应该看起来像fread(&member, sizeof member, 1, file)并测试fread()的返回值!
  • 停止编辑答案以回复他们;改为对您自己的问题进行编辑或发表评论(如果/当您达到 50 个代表时,您也可以在答案上留下 cmets)。

标签: c mp3 id3v2


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您读取的字节数是否足够?您传递的是 tag.TAG 的地址,但提供的是 sizeof(tag) 而不是 sizeof(tag.TAG)。

    【讨论】:

      【解决方案3】:

      那将是 %c 用于打印一个字符,而不是 %s(用于打印空终止 char*):

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

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

      【讨论】:

      • 实际上,%hhd,将char 视为整数。
      猜你喜欢
      • 1970-01-01
      • 2019-12-12
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2020-02-11
      相关资源
      最近更新 更多