Почему Synchsafe целое?
Я начал читать mp3-файлы на c++.
все прошло хорошо, пока я не прочитал спецификации ID3-Tag. В ID3v2-заголовке есть некоторая информация о его размере, хранящемся в так называемом Synchsafe Integer. Это четырехбайтовое целое число, в котором самый значительный бит каждого байта равен нулю.
Я узнал, как преобразовать его в целое число ordenaty, но я не могу перестать спрашивать себя, почему целое значение хранится таким неоправданно сложным способом.
I надеюсь, что есть кто-то, кто может сказать мне, почему он хранится таким образом.
3 ответов
чтобы понять, почему используются целые числа, безопасные для синхронизации, полезно немного понять формат данных MP3, а также то, как MP3-файл воспроизводится медиаплеером. Данные MP3 хранятся в файле в виде серии кадров. Каждый кадр содержит небольшой бит цифровой музыки, закодированной в формате MP3, а также некоторые метаданные о самом кадре. В начале каждого кадра MP3 11 бит (иногда 12) все установлены на 1. Это называется синхронизацией, и это шаблон, который выглядит медиаплеер при попытке воспроизведения MP3-файла или потока. Если игрок находит эту 11-битную последовательность, то он знает, что нашел MP3-кадр, который можно декодировать и воспроизводить.
Как вы знаете, тег ID3 содержит данные о треке в целом. Тег ID3 -- в версии 2.x и позже -- находится в начале файла или даже может быть встроен в поток MP3(хотя это не часто делается). Заголовок тега ID3 содержит 32-битовое поле, которое указывает, сколько байт в теге. Максимальное значение, которое может содержать 32-разрядное целое число без знака, - 0xFFFFFFFF. Поэтому, если мы напишем 0xffffffffff в поле size, мы утверждаем, что действительно большой тег (прагматически слишком большой). Когда игрок пытается воспроизвести файл или поток, он ищет 11-битную последовательность фрейма данных MP3, но вместо этого находит поле size в заголовке тега ID3 и пытается воспроизвести тег, так как поле size имеет первые 11 бит. Этот обычно звучит не так хорошо, в зависимости от ваших музыкальных вкусов. Решение состоит в том, чтобы создать целочисленный формат, который не содержит 11-битных последовательностей всех 1. Следовательно, безопасный для синхронизации целочисленный формат.
безопасное для синхронизации целое число можно преобразовать в целое число в 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/
6.2. Synchsafe целые числа
в некоторых частях тега неудобно использовать схему несинхронизации, поскольку размер несинхронизированных данных заранее не известен, что особенно проблематично с дескрипторами размера. Решение в ID3v2-использовать целые числа synchsafe, в которых никогда не может быть ложных синхронизаций. Целые числа Synchsafe-это целые числа, которые сохраняют свой самый высокий бит (бит 7) обнуленным, делая семь битов из восьми доступными. Таким образом, a 32 бит synchsafe integer может хранить 28 бит информации.
от http://www.id3.org/id3v2.4.0-structure
это тесно связано с тем, что они называют "Несинхронизацией" в данном документе, вы должны прочитать всю Главу 6. Все это связано с максимальной совместимостью с широким спектром программного и аппаратного обеспечения.