Binary format
Jul. 15th, 2008 04:28 pmЗакінчив недавно один проект - компілятор для інформаторів. Він перетворював деревовидну структуру з текстовими повідомленнями, звуковими файлами і паузами між ними на бінарний файл для електронного девайса. Трошки погеморроївся зі зміщеннями у бінарі, з GUI, з XML для зберігання проектів, але воно запрацювало.
А сьогодні, нежданно-негаданно, викинуло коник - покоцало таблицю зміщень файлів у бінарі, а деякі файли зовсім не записало.
А сьогодні, нежданно-негаданно, викинуло коник - покоцало таблицю зміщень файлів у бінарі, а деякі файли зовсім не записало.
Я запасся папірцями, терпінням - і почав розслідування. Через годину мучання калькулятора та дебагера я знайшов помилку. У WAV-файла (а саме у такому форматі програма приймає звукові повідомлення для подальшого стиснення і кодування) є декілька заголовків. А саме: RIFF-, WAVE-, fmt- і data-заголовок. Кожен з цих заголовків містить токен (за яким він і отримав назву) і деяку інформацію, що включає в себе розмір інкапсульованих даних у байтах. Так от, на одному із файлів (8-му аз порядковим номером у реєстрі), компресор, вичитуючи заголовки, дійшов до останнього data-заголовку (який ще називається заголовком семплу) і невірно прочитав розмір інкапсульованих даних. 4 байти 1A EE 00 00 він інтерпретував як 0 (читаючи uint32_t). Хвилин 30 я тупо сидів і дивився на файл у HEX-редакторі, намагаючись придумати умови, у яких ifstream інтерпретує EE 1A 00 00 як 0.
Потім прийшов Вова, який займається у нас електронікою, і приніс давно очікуване нове пиво, зварене місцевим пивзаводом за німецькими технологіями з німецького солоду і сусла. Продається за 16 грн/л і лише на розлив. І лише у 2-х точках по місту: у "Материку" і ще десь. Достатньо було одного ковтка... щоб поставити std::ios::binary. Ну а потім - веселі балачки про електроніку, програмування, життя, пиво...
Отак от буває.
Потім прийшов Вова, який займається у нас електронікою, і приніс давно очікуване нове пиво, зварене місцевим пивзаводом за німецькими технологіями з німецького солоду і сусла. Продається за 16 грн/л і лише на розлив. І лише у 2-х точках по місту: у "Материку" і ще десь. Достатньо було одного ковтка... щоб поставити std::ios::binary. Ну а потім - веселі балачки про електроніку, програмування, життя, пиво...
Отак от буває.