【发布时间】:2012-12-19 08:49:44
【问题描述】:
对于 ID3 v2.3.0 的帧大小字节应如何编码/解码,我有些困惑。根据(非正式)ID3 v2.3.0 规范,每帧的大小应编码为 4 个字节,其中每个字节的最高有效位未使用。要计算大小,它将采用以下公式:
byte MASK = (byte)0x7F;
int size = 0;
for (int = 0; i < 4; i++) {
size = size * 128 + (b[i] & MASK);
}
但是当我使用解析器解析一些 MP3 文件时,相当多的文件具有 GEOB(通用封装对象标签)帧,其大小字节被编码为 Big Endian 32 位整数。
在我通过使用适当的算法重新编码来修复这些字节后,Windows 7 和 Winamp 等商业软件无法正确显示后续标签(在某些情况下,TIT2 就在 GEOB 之后,所以歌曲的标题是虽然它在文件中但不显示)。
我还发现 MCDI(音乐 cd 标识符)和 TALB('专辑/电影/节目标题')标签存在类似问题。
我通读了 v2.3 规范,并在 Google 上进行了搜索,但无法找到有关使用 32 位整数作为这些帧的大小元数据的任何信息。然而,不同商业软件中的常见行为似乎建议此类字段应使用 32 位整数作为大小,而不是使用 0x7F 屏蔽的 4 个字节。
所以我只是想知道这里是否有人在 ID3 v2.3 上工作过并且可以为我澄清这一点。
【问题讨论】: