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?