0

我正在尝试读取 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);
   }
}

一个。

4

3 回答 3

0

你读的字节够吗?您正在传递 tag.TAG 的地址,但提供 sizeof(tag) 而不是 sizeof(tag.TAG)。

于 2011-06-16T18:53:23.617 回答
0

那将%c用于打印 char 而不是%s(用于打印 null-terminated char*):

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

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

于 2011-06-16T18:53:36.393 回答
0

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

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

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

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

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

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

于 2011-06-16T20:44:18.327 回答