对于 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('Album/Movie/Show title')标签有类似的问题。
我通读了 v2.3 规范,并在 Google 上进行了搜索,但无法找到有关使用 32 位整数作为这些帧的大小元数据的任何信息。然而,不同商业软件中的常见行为似乎建议此类字段应使用 32 位整数作为大小,而不是使用 0x7F 屏蔽的 4 个字节。
所以我只是想知道这里是否有人在 ID3 v2.3 上工作过并且可以为我澄清这一点。