如何获取 ID3v2 标头的必要值?

发布于 2024-11-16 05:04:21 字数 501 浏览 3 评论 0原文

我正在尝试读取 mp3 文件的 ID3V2 标头。我可以获取/打印 ID3 并想打印出 char 类型的“version”和“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);
   }
}

A.

I'm trying to read header of ID3V2 of mp3 files. I can get/print ID3 and want to print out "version" and "subversion" which is type char, but I can't get what i need.

here is code:

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

A.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

难如初 2024-11-23 05:04:21

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

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(&tag, 1, sizeof(tag),file); // tag is structure with elements of header

无需将 fread 行更改为:(尽管它会更清楚地显示意图)。

You should read only once the header. i.e. if you have

struct id3v2hdr {
    char TAG[3];
    unsigned char version;
    unsigned char subversion;
    ...
}

Your code would be:

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

Note that version and subversion are byte-sized integers, not printable characters, so you should use %hhu (%hhd if they are signed) as its format specification.

Also, the pointer to the first element of a struct, and the pointer to a struct compare equal, so changing your fread line to:

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

is unnecessary (tough it would show the intent much more clearly).

余生共白头 2024-11-23 05:04:21

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

Are you reading enough bytes? You are passing the address of tag.TAG, but supplying sizeof(tag) and not sizeof(tag.TAG).

來不及說愛妳 2024-11-23 05:04:21

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

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

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

That would be %c for printing a char and not %s (used for printing null-terminated char*):

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

Use %d if you want to see the byte as a number.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文