Чтобы понять, почему используются безопасные от синхронизации целые числа, полезно немного узнать о формате данных 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 в поле размера, мы будем претендовать на действительно большой тег (прагматически слишком большой).Когда проигрыватель пытается воспроизвести файл или поток, он ищет 11-битную последовательность фрейма данных MP3, но вместо этого находит поле размера в заголовке тега ID3 и пытается воспроизвести тег, так как поле размера имеет первые 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;
}
Надеюсь, это поможет.