>>27307 >>27314
Ну раз курсовая работа....
>растягивать файл алгоритмом LZW.
>Сам алгоритм предполагает наличие начального словаря, который по ходу сжатия файла(нахождения в нём новых последовательностей байтов) расширен. То есть для того чтобы в дальнейшем растянуть файл обратно, нужно знать словарь. И вообще понять, подлежит файл растягиванию или же это просто белиберда из битов. Пока такие соображения: первые биты в сжатом файле сделать что-то типа сигнатурных, чтобы можно было сходу определить можно ли растянуть файл. И после сигнатурных битов будут биты сжатого файла, а потом будет магическое число типа как "разделитель" между файлом и словарём. Насколько хорошая идея использовать магическое число как разделитель? Или же лучше будет выделить под сжатый файл первые 4 бита как сигнатурные, где помимо метки сжатия файла будет ещё число под оффсет, как количество битов после которых заканчивается сжатый файл и будут пары ключ-значение из словаря? Или может быть лучше сделать по-другому как-то?
Строение формата: разделить стрим, словарь и контейнер. Все числа - little endian! Файл маппится в память целиком через либу mio, дальше работаешь с std::span и структурами. Стрим состоит из заголовка стрима и стрима. Без сигнатуры. Контейнер состоит из сигнатуры, глобального заголовка, содержащего длину области контейнера и смещения областей стрима и словаря в ней ОТНОСИТЕЛЬНО КОНЦА ЗАГОЛОВКА. После следуют области, сначала область словаря, потом область стрима, потом конец файла. Ты провершь это при загрузке файла. Размеры вычислишь как разницы этих смещений.
Начальный словарь может иметь смысл хранить в отдельном файле для переиспользования, поэтому область словаря - это может быть просто CRC32-хэш от файла словаря, который при операциях надо задать явно. Также начальный словарь можно
хранить внутри контейнера или использовать захардкоденный. Поэтому сначала 1 байт перечисление. 0 - хардкод, 1 - файл, 2 - внутри. Если 0 - то инициализируем хардкодом. Если 1 - берём имя файла, добавляем ".dic" - вот и наш словарь. Проверяем наличие файла. Маппим его. Проверяем формат словаря. Поскольку задача учебная, то для твоего удобства в его редактировании это просто массив, сериализованный в BSON/bencode. Поскольку тебя проси