我开始用C++读取mp3文件。
一切都很顺利,直到我读到ID3标签的规格说明。在ID3v2头部中有一些关于其大小的信息存储在所谓的同步安全整数中。这是一个四字节的整数,每个字节的最高有效位都设置为零。
我找到了如何将其转换为普通整数,但我想知道为什么要以这种不必要的复杂方式存储整数值。
我希望有人能告诉我为什么要以这种方式存储。
正如你所知,ID3标签包含有关整个曲目的数据。ID3标签 - 在2.x版本及更高版本中 - 位于文件开头,甚至可以嵌入MP3流中(尽管这不经常发生)。ID3标签的标题包含一个32位大小字段,该字段指示标签中有多少字节。无符号32位整数可以容纳的最大值是0xFFFFFFFF。因此,如果我们将0xFFFFFFFF写入大小字段,则声称拥有一个非常大的标签(实际上太大)。当播放器尝试播放文件或流时,它寻找MP3数据帧的11位序列,但是找到了ID3标签标题中的大小字段,并尝试播放标签,因为大小字段的前11位已设置。这通常听起来不太好,这取决于您的音乐口味。解决方案是创建一个整数格式,其中不包含所有1的11位序列。因此出现了同步安全整数格式。
可以使用类似以下内容的代码将同步安全整数转换为C/C ++中的整数:
int ID3_sync_safe_to_int( uint8_t* sync_safe )
{
uint32_t byte0 = sync_safe[0];
uint32_t byte1 = sync_safe[1];
uint32_t byte2 = sync_safe[2];
uint32_t byte3 = sync_safe[3];
return byte0 << 21 | byte1 << 14 | byte2 << 7 | byte3;
}
希望这可以帮助到你。除了上面的答案,我还想添加一篇来自我的博客:http://phoxis.org/2010/05/08/synch-safe/
在it技术方面,这篇博客讲述了synch-safe整数编码的细节和解释。