为什么有Synchsafe Integer?

the*_*rio 9 mp3 integer id3 id3-tag

我开始用c ++阅读mp3文件.

一切顺利,直到我读到ID3-Tag的规格.ID3v2-Header中有一些关于它的大小存储在所谓的Synchsafe Integer中的信息.这是一个四字节整数,其中每个字节的最高有效位设置为零.

我发现了如何将它转换为ordenaty整数,但我无法停止问自己为什么整数值以这种不必要的复杂方式存储.

我希望有人可以告诉我为什么以这种方式存储它.

J. *_*lin 24

要了解使用同步安全整数的原因,了解一下MP3数据的格式以及媒体播放器如何播放MP3文件是有帮助的.MP3数据作为一系列帧存储在文件中.每帧包含一小部分以MP3格式编码的数字音乐以及关于帧本身的一些元数据.在每个MP3帧的开头,11位(有时是12位)全部设置为1.这称为同步,它是媒体播放器在尝试播放MP3文件或流时所寻找的模式.如果播放器找到这个11位序列,那么它知道它找到了一个可以解码和播放的MP3帧.

请参阅:www.id3.org/mp3Frame

如您所知,ID3标签包含有关整个轨道的数据.ID3标签 - 版本2.x及更高版本 - 位于文件的开头,或者甚至可以嵌入MP3流中(尽管通常不会这样做).ID3标记的标头包含32位大小的字段,表示标记中有多少字节.无符号的32位整数可以保持的最大值是0xFFFFFFFF.因此,如果我们将0xFFFFFFFF写入size字段,我们就会声称一个非常大的标记(实际上太大了).当播放器尝试播放文件或流时,它会查找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;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 非常感谢你.我以为我永远不会得到它. (2认同)