为什么是同步安全整数
Why sync-safe integer?
我最近正在开发ID3v2.4.0。阅读2.4.0文档,我发现了一个我无法理解的特定部分-同步安全整数。ID3v2为什么使用这种方法?
当然,我知道为什么ID3v2使用不同步方案,该方案用于阻止MPEG解码器将ID3标签视为MPEG同步数据。但我不能理解的是为什么同步安全的整数而不是非同步方案(=插入$00)。
在表示标签大小而不是插入$00时,是否有任何理由采用同步安全整数?这两种方法产生的效果完全相同。
ID3v2文档说未同步数据的大小是事先不知道的。但这种说法没有意义。如果标签数据存储在缓冲区中,只需将有问题的字符替换为$FF 00,就可以知道未同步数据的大小。
有人能帮我吗?
为了简单起见,unsync/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报头和帧报头的大小是非同步(如果有的话)应用后的大小。但是,允许在不取消同步的情况下写入帧数据,因为id3v2可以用于标记mp3以外的文件,其中取消同步/同步的概念没有意义。我认为第6.2节试图说的是"无论这是一个mp3文件,还是一个帧是非同步/同步写入的,帧大小总是以mpeg同步安全的方式写入"。
ID3v2.4帧可以在帧头中设置"数据长度指示器"标志,在这种情况下,您可以发现同步后的缓冲区有多大。参考规范第4.1.2节。
有人能帮我吗?
来自编写了符合id3v2标签读取器的人的一些有用的建议:不要试图理解规范。它肯定是由疯子和虐待狂写的。只要再看一眼,我就会做噩梦。
- 线程安全整数数组?
- 哪些整数操作不安全
- 单调计数整数的比较安全吗?
- 将整数添加到数组值而无需调用它的最安全方法
- 哪种整数类型可以安全且便携式用于始终保持指针值
- 使用具有不同整数类型的 std::vector 是否始终安全<size_t>?
- "auto"对 C++17 中的整数溢出是否安全?
- 一个整数可以安全阅读,而另一个线程可能会在其中编写
- 重新Interalpret_cast浮动整数是安全的吗?
- 将负整数与size_t一起使用是否安全
- 将常量字符数组转换为标头中的整数是否始终安全
- 需要一个支持 16 位整数 (c++) 的免费线程安全矩阵数学库
- 将长整数转换为字符数组的最安全方法是什么
- 依靠任何数字类型(无符号、整数等)的隐式提升来加倍是否安全
- 如果使用无符号整数,则通过减去1将基于1的编号转换为基于0的编号是否安全
- 转换枚举中整数的安全方法
- 有没有一种安全的方法可以在不触发溢出的情况下获得有符号整数的无符号绝对值
- 安全派生指针的整数表示形式
- 为什么是同步安全整数
- 科学记数法对C中的整数常数安全吗