Алгоритм исключения попадания одинаковых байт
Вот то что мне предложили на компрессион:
out=(symbol+1+old_symbol)%256;
old_symbol=out;
fwrite(&out,1,1,file);
А при чтении — наоборот:
fread(&in,1,1,file);
if(in==old_symbol)printf("Error in input file");
symbol=(in-1-old_symbol+256)%256;
old_symbol=in;
Но этот код при встрече 255 символа повторяет предыдуший, а значит не подходит под условие задачи
1. Открываем файл
2. Закидываем содержимое в массив
3. По байтам парсируем массив
- Если [original_array!=original_array[i-1]]
То копируем элемент в new_array
4. Записываем в файл
Главная цель не потерять данные, то есть чтобы их можно было востановить
Тогда нужно перейти к 9-битному алфавиту.
Это слишком увеличит файл, читай условие: желательно не увеличивать файл вообще, а в шудшем случае увеличить на 1-2 байта, но стабильно, то есть что для мегабайта данных, также и для 2,3 итд мегобайт
Eto nevozmojno, t.k. ty pytaeshsya v 1 byte zapihnut' informaciyu o 256-ti simvolah + informaciu o povtoryaemosti otnositel'no predyduschego - vse eto v odin byte ne vlezet.
Mojno poprobovat' 9-ti bitnyj alfavit +statisticheskoe kodirovanie (sjatie), no opyat' je nikakoj garantii, chto vyhodnoj file budet ne tolsche vhodnogo :)
Я бы сделал так:
1. Открываем файл
2. Закидываем содержимое в массив
3. По байтам парсируем массив
- Если [original_array!=original_array[i-1]]
То копируем элемент в new_array
4. Записываем в файл
И чего? как узнать где был символ? Строка очень длинная, чтобы запоминать позицию уйдет слишком много байт
Главная цель не потерять данные, то есть чтобы их можно было востановить
Сформулируй нормально задачу.
Если можно запаковывать N подряд идущих байт, то это RLE. Как не крути этот алгоритм, файл все равно будет запаковываться по разному. А в общих случаях будет намного больше исходного.
Почему нельзя запаковывать весь файл?
Вобщем сформулируй все что надо.
Вобщем сформулируй все что надо.[QUOTE]
Можно паковать как хочешь, но есть условие чтобы файл не увеличивался или увеличивался по самому минемуму, файл можно было потом обратно распоковать и без потерь. Ну и конечноже запакованный он должен исключать попадание двух подряд идуших символов
Можно паковать как хочешь, но есть условие чтобы файл не увеличивался или увеличивался по самому минемуму
Едрен батон. Нельзя было сразу написать что нужен алгоритм архивирования файла?
Надо было заморачивать.
Вариантов много. Можно юзать готовые решения.
Можно написать самому. Алгоритмов тоже куча.
На сайте есть исходники. Я один пробывал, тот что LZW. Правда он не рабочий, точнее почти рабочий, он не до конца распаковывает. Если надо могу его подправить.
Я только сейчас начинаю догонять понемногу что Ты хотел. Ты хотел чтобы в запакованном файле небыло подрят повторяющихся символов, так?