Автор
|
Тема: Подскажите чем лучше ужать....
|
Sourcer |
опубликован 09-01-2002 12:14 MSK
Есть массив в 20 байт и мне его надо ужать ну хотябы в 2 раза. На первый взгляд кажется что зачем надо ужимать 20 байт, но проблема в том что таких фреймов будет в файле миллионы... И кажтся что не реально ужать такой маленький массив, но дело в том что в этом массиве 75% $00 .. водскажите каким лучше алгоритмом всё это сжимать и так чтобы этот массив не распухал... тесть либо его размер оставался таким же или меньше...
|
eyes
|
опубликован 09-01-2002 12:23 MSK
Ну можно целиком файло ужать (любой алгоритм подойдет).Для твоего случая (навскидку): Структура... в начале DWORD (единица - есть данные, ноль - нету = 00); После этого идет перечисление только тех циферь, которые не ноль |
migel
|
опубликован 09-01-2002 12:39 MSK
RLE пойдет наверно |
Sourcer
|
опубликован 09-01-2002 13:23 MSK
2eyes: Ну целиком нельзя файл жать... к нему нужен очнь быстрый доступ2migel: RLE нето ... там много нулей, но это не значет что они все подрят идут... |
Flex Ferrum
|
опубликован 09-01-2002 13:34 MSK
Без распухания, ИМХО, не получится. А то, что предложил eyes во втором абзаце - вполне реально. Только в твоем случе достаточно 3-х байт. Кстати, 20 * 1000000 = ~20 MB - не так много. |
eyes
|
опубликован 09-01-2002 14:03 MSK
2FlexFerrum: ну просто предложил простой метод... для оптимизаций - поле фантазий (если они нужны:) |
stan
|
опубликован 09-01-2002 14:19 MSK
Первое, что пришло в голову: выделяешь 20 битов, у которых единицы выставляешь в тех местах, где данные нулевые. Далее выделяешь по пять битов, в которые пишешь места, где данные ненулевые, далее пишешь сами ненулевые данные. В детали сам не вникал... |
Sourcer
|
опубликован 09-01-2002 14:27 MSK
Ну ладно... всем спасибо ... |
Student
|
опубликован 09-01-2002 17:46 MSK
А вот так:typedef struct HEADER { DWORD dwBitMask; // 32-bit: 20 младших бит показывают как расположены данные в массиве (т.е. если бит равен 0, то байт в этой позиции массива ноль и наоборот) BYTE *bData; // ненулевые данные, размер в 8 старших битах dwBitMask } *PHEADER; Конечно, если ненулевых байтов >= 16, то этот метод уже не оптимален. |