Witam! Chciałem zrobić szybko program, którym mógłbym edytować tagi plikom mp3. Na portalu znajduje się świetny artykuł (ID3 Tag v2), jednak nie udało mi się uporać z synsafe int.
Zauważyłem, że obcina mi tytuł, wykonawce, jeśli zawierają więcej niż 30 znaków. Dopiero zacząłem się wczytywać w w/w artykuł. Zacytuję:
Długość pola jest 32-bitowym synchsafe Integerem, zapisanym w big endian (pierwszy bajt jest najbardziej znaczący). Należy zwrócić uwagę na to, że nie chodzi tu o długośćw sensie ilości znaków, a o ilość bajtów potrzebną do zapisania napisu w wybranym przez nas kodowaniu.
Jednak, skoro tak wygląda struktura nagłówka tagu:
struct ID3Header
{
char id[3]; /* napis ID3 */
unsigned char verMajor;
unsigned char verMinor;
unsigned char flags;
unsigned long size;
};
to znaczy, że rozmiar tej struktury wynosi 12 bajtów, tak? sizeof(ID3Header) zwraca 12.
Tymczasem tytuł utworu zaczyna się w już od 4 bajtu tagu. O co zatem chodzi??
Mój kod, który mi obcina nazwy, wygląda tak:
_ver = new char[4];
_tytul = new char[31];
_wykon = new char[31];
_album = new char[31];
int kursor = -128;
plik.seekg( kursor, ios::end);
plik.read((char*) _ver, 3);
kursor+=3;
plik.seekg( kursor, ios::end);
plik.read((char*) _tytul, 30);
kursor+=30;
plik.seekg( kursor, ios::end);
plik.read((char*) _wykon, 30);
kursor+=30;
plik.seekg( kursor, ios::end);
plik.read((char*) _album, 30);
kursor+=30;
Samo to, że widzę pierwsze 30 znaków każdego pola, już mnie cieszy:) Co ciekawe, gdybym odczytał np nazwę albumu do bufora 40bajtowego, nazwa wciąż jest ucięta, a w buforze znajdują się następne tagi...
Czy to jest sprawa tego syncsafe?