Я хочу попробовать читать теги ID3 самостоятельно без библиотеки в образовательных целях. Я должен сделать презентацию для школы о том, как это сделать.
Сначала я прочитал заголовок ID3 (первые 10 байт). Оно работает. Теперь я пытаюсь прочитать первый заголовок кадра, который почти во всех моих файлах следует сразу за заголовком ID3. Таким образом, нет расширенного заголовка. Заголовок кадра тоже должен быть 10 байт, верно? Ну тогда у меня проблема.
Заголовок кадра во всех файлах, которые я проверил, структурирован следующим образом:
+------------+
- Frame ID -
+------------+
- Frame Size -
+------------+
- Frame Flags-
+------------+
После этого должно следовать значение, верно? Если идентификатор TALB (Album), это должно быть название альбома. И значение должно быть размером значения размера кадра. Однако все мои файлы имеют 0x03
перед названием альбома, фактически перед всеми кадрами, и размер кадра также на 1 больше. Пример:
ID кадра = TIT2
Размер кадра = 13(12+1 для 0x03)
Флаги ...
Значение = (0x03 символ)3 Doors Down
Что означает это значение? Я немного читал о кодировании текста, и это значение будет:
$03 Кодировка UTF-8 [UTF-8] Unicode [UNICODE]. Завершено с $00.
Но я не видел ни одной части, где находится это значение кодировки текста.
Это мой код (упрощенный), чтобы прочитать значение заголовка кадра:
//Method from a FrameHeader Class, takes 10 bytes as parameter
void setHeader( char* value ){
int i = 0;
for(; i < 4; i++ ){
identifier += value[i];
}
for(; i < 8; i++ ){
size = size << 8 | static_cast<unsigned char>(value[i]);
}
for(; i < 10; i++ ){
flags += value[i];
}
}
memblock = new char[10];
iStream.read( memblock, 10 );
FrameHeader frameHeader;
frameHeader.setHeader( memblock );
memblock = new char[ frameHeader.getSize() ];
iStream.read( memblock, frameHeader.getSize() );
cout << "Frame Indentifier : " << frameHeader.getIdentifier() << endl;
cout << "Frame Size : " << frameHeader.getSize() << endl;
cout << "Frame value : " << memblock << endl;*/
Я надеюсь, что моя проблема ясна. Я не могу загрузить файл, так как это песня, защищенная авторским правом, и у меня могут возникнуть проблемы с законом.
Я получил всю информацию из этого источника.
0x03
перед текстом является байтом кодирования.0x03
указывает на UTF-8. en.wikipedia.org/wiki/ID3#ID3v2 - person ooga   schedule 26.10.2014