Как это работает

Как Cubrim сжимает данные, шаг за шагом

Cubrim превращает поток байтов в компактный архив через фиксированный конвейер. Ниже каждый этап показан на реальных данных — вращайте мышью, листайте этапы и смотрите, что именно происходит с вашими данными.

Этап / 6 — Доменизация Построение куба Карта расстояний Кодирование длин серий Кодирование значений Сборка и страховка
Тяните, чтобы вращать · колесо — масштаб
1

Доменизация

Байты → значения

Входные байты становятся последовательностью значений. Каждая позиция в файле несёт одно значение в диапазоне 0–255. Это исходный материал, из которого строится куб.

2

Построение куба

φ: индекс → координаты

Каждое значение попадает в координату внутри N-мерного куба. По умолчанию N=2 и ребро равно 256, поэтому файл становится сеткой 256×256: позиция i отображается в (i mod 256, i ÷ 256) через смешанно-разрядную функцию φ. Значение в каждой ячейке — это её высота и цвет.

3

Карта расстояний

Промежутки между заполненными точками

Хранятся только ячейки, в которых действительно есть данные. Вдоль каждой оси Cubrim записывает расстояние от одной заполненной точки до следующей — промежутки — вместо абсолютных координат. Разреженные данные превращаются в короткий список промежутков.

4

Кодирование длин серий

Схлопывание повторов

Потоки промежутков кодируются длинами серий: серия одинаковых промежутков схлопывается в одну пару (значение, количество). Регулярные, кластеризованные раскладки здесь сжимаются особенно сильно.

5

Кодирование значений

битпак · RLE-коды · Хаффман

Поток значений упаковывается. По умолчанию каждое значение пакуется в минимальное фиксированное число бит; кластеризованные потоки используют коды длин серий; а энтропийная схема назначает короткие канонические коды Хаффмана частым значениям и длинные — редким.

6

Сборка и страховка

заголовок + блоб, либо raw-store

Спереди добавляется компактный заголовок (параметры, нужные для полного восстановления), и потоки склеиваются в итоговый архив. Если путь через куб не выигрывает у хранения входа как есть, Cubrim откатывается на raw-store — поэтому результат никогда не растёт. Декодирование точно обращает каждый шаг: без потерь, байт в байт.

Byte values 0–255 as coloured cells

Height = value magnitude

low mid high

Flat 1D ribbon folds into a 2D grid

24×24 cells shown (scaled-down illustration)

low mid high

Empty cells dimmed; arrows show gaps

Only populated points kept

low mid high

Repeated gap bars collapse to one block

(value × count) = compact pair

low mid high

Frequent values → short bit codes

Rare values → long codes (Huffman)

low mid high

Streams assembled into one archive

Raw-store fallback if cube > input

low mid high

Всегда без потерь

Каждый этап обратим. Декодирование читает заголовок и проходит конвейер в обратную сторону, восстанавливая исходные байты в точности — режима с потерями не существует.