为什么同步安全整数?

时间:2011-10-26 05:26:22

标签: c++ mp3 meta-tags id3 id3v2

我最近在研究ID3v2.4.0。 阅读2.4.0文档,我发现了一个我无法理解的特定部分 - 同步安全整数。 为什么ID3v2使用这种方法?

当然,我知道为什么ID3v2使用非同步方案,用于防止MPEG解码器将ID3标签视为MPEG同步数据。 但我无法理解的是为什么同步安全整数而不是非同步方案(=插入$ 00)。

在表达标签大小而不是插入$ 00时,是否有任何理由采用同步安全整数? 这两种方法产生完全相同的效果。

ID3v2文档说未提前知道未同步数据的大小。 但这种说法没有意义。 如果标签数据存储在缓冲区中,只需用$ FF 00替换有问题的字符就可以知道非同步数据的大小。

有没有人可以帮助我?

1 个答案:

答案 0 :(得分:2)

我认为这很简单,并且unsynch / synch方案在mpeg文件上使用时才有意义。

读取四个字节并将它们转换为常规整数是非常简单的:

// pseudo code
uint32_t size;
file.read( &size, sizeof(uint32_t) );
size =   (size & 0x0000007F) |
       ( (size & 0x00007F00) >> 1 ) |
       ( (size & 0x007F0000) >> 2 ) |
       ( (size & 0x7F000000) >> 3 );

如果他们使用与帧数据相同的非同步方案,则需要分别读取每个字节,查找FF00模式,并逐字节重建整数。此外,如果标头中的“size”字段可能是可变数量的字节,由于插入了非同步字节,整个标头将是可变数量的字节。他们更简单地说'标题总是大小为10个字节,它看起来像这样...... '。

  

ID3v2文档说未提前知道未同步数据的大小。但这种说法没有意义。如果标签数据存储在缓冲区中,只需用$ FF 00替换有问题的字符就可以知道非同步数据的大小。

你是对的,没有意义。在id3v2标头和框架标头中写入的大小是之后>非同步(如果有)的大小。但是,允许在没有unsynching的情况下写入帧数据,因为id3v2可以用于标记除mp3之外的文件,其中unsynch / synch的概念没有意义。我认为 6.2试图说的是',无论这是一个mp3文件,还是一个未编辑/同步的帧,帧大小总是以mpeg同步写入安全的方式'。

ID3v2.4帧可以在帧头中设置“数据长度指示符”标志,在这种情况下,您可以找到同步后缓冲区的大小。请参阅规范的第4.1.2节。

  

有没有人可以帮助我?

编写符合标准的id3v2标签阅读器的人提供了一些有用的建议:不要尝试理解规范。它肯定是由疯子和虐待狂写的。再看一遍就是让我做恶梦。