我正在尝试读取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);
}
请注意,version
和 subversion
是字节大小的整数,而不是可打印的字符,因此您应该使用 %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
。