2011-03-07 41 views
7

我开始用C++读取mp3文件。为什么会有Synchsafe整数?

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

我发现了如何将其转换为ordenaty整数,但我不能停止问自己,为什么一个整数值存储在这样的unnecessery复杂的方式。

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

回答

20

要理解使用同步安全整数的原因,有必要了解一些关于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,我们声称一个非常大的标签(实际上太大)。播放器尝试播放文件或数据流时,会查找MP3数据帧的11位序列,但会在ID3标签标头中查找尺寸字段并尝试播放标签,因为尺寸字段具有前11个位设置。这通常听起来不太好,这取决于你的音乐品味。解决方案是创建一个不包含全1的11位序列的整数格式。因此是同步安全的整数格式。

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

希望这有助于:

一个同步安全整数可以使用类似下面的被转换成在C/C的整数++。

+2

非常感谢。我以为我永远不会得到它。 – 2011-04-14 11:44:06

+2

真棒解释,男人! +1! – jwueller 2011-04-14 12:58:26

+0

非常明确的解释。谢谢你的伙伴:) – 2016-09-15 01:51:18

0

6.2。 Synchsafe整数

在标签的某些部分,使用非同步方案很不方便,因为非同步数据的大小事先是未知的,这对于大小描述符而言尤其成问题。 ID3v2中的解决方案是使用synchsafe整数,其中不会有任何错误的同步。 Synchsafe整数是保持其最高位(第7位)整数归零,使得七位出来的八个可用。因此一个32位同步安全整数可以存储28位信息。

http://www.id3.org/id3v2.4.0-structure

它是密切相关的,他们称之为“Unsynchronisation”给定的文档中,你应该读整章6.所有这一切都最大限度地与广泛的软件兼容性和相关硬件。

+0

我不undersand为什么大小应该是未知的。有不同大小的数据字段,但在规范中描述了特定信息存储在文件中的信息以及此信息的大小。 – 2011-03-07 18:00:35

相关问题