【发布时间】:2017-11-25 09:19:30
【问题描述】:
我一直在尝试通过解析 mp3 文件并检索每个帧的大小来检索 ID3V2 标记帧。到目前为止,我没有运气。
我已有效地将内存分配给缓冲区以帮助读取文件,并且已成功打印出标题版本,但在检索标题和帧大小时遇到了困难。对于标题帧大小,我得到 1347687723,虽然在十六进制编辑器中查看文件我看到 05 2B 19。
我的代码的两个 sn-ps:
typedef struct{ //typedef structure used to read tag information
char tagid[3]; //0-2 "ID3"
unsigned char tagversion; //3 $04
unsigned char tagsubversion;//4 00
unsigned char flags; //5-6 %abc0000
uint32_t size; //7-10 4 * %0xxxxxxx
}ID3TAG;
if(buff){
fseek(filename,0,SEEK_SET);
fread(&Tag, 1, sizeof(Tag),filename);
if(memcmp(Tag.tagid,"ID3", 3) == 0)
{
printf("ID3V2.%02x.%02x.%02x \nHeader Size:%lu\n",Tag.tagversion,
Tag.tagsubversion, Tag.flags ,Tag.size);
}
}
【问题讨论】:
-
也许你需要一个打包的
struct,可能有填充字节用于对齐uint32_t size。使用了 10 个字节的存储空间,但 MSVC 报告struct的大小为 12。一种安全的方法是将数据读入unsigned char的数组并从数组中取出值。
标签: c parsing bit-manipulation id3v2