Как Cubrim сжимает данные, шаг за шагом
Cubrim превращает поток байтов в компактный архив через фиксированный конвейер. Ниже каждый этап показан на реальных данных — вращайте мышью, листайте этапы и смотрите, что именно происходит с вашими данными.
3D visualisation requires WebGL. Stage descriptions remain available below.
Доменизация
Байты → значенияВходные байты становятся последовательностью значений. Каждая позиция в файле несёт одно значение в диапазоне 0–255. Это исходный материал, из которого строится куб.
Построение куба
φ: индекс → координатыКаждое значение попадает в координату внутри N-мерного куба. По умолчанию N=2 и ребро равно 256, поэтому файл становится сеткой 256×256: позиция i отображается в (i mod 256, i ÷ 256) через смешанно-разрядную функцию φ. Значение в каждой ячейке — это её высота и цвет.
Карта расстояний
Промежутки между заполненными точкамиХранятся только ячейки, в которых действительно есть данные. Вдоль каждой оси Cubrim записывает расстояние от одной заполненной точки до следующей — промежутки — вместо абсолютных координат. Разреженные данные превращаются в короткий список промежутков.
Кодирование длин серий
Схлопывание повторовПотоки промежутков кодируются длинами серий: серия одинаковых промежутков схлопывается в одну пару (значение, количество). Регулярные, кластеризованные раскладки здесь сжимаются особенно сильно.
Кодирование значений
битпак · RLE-коды · ХаффманПоток значений упаковывается. По умолчанию каждое значение пакуется в минимальное фиксированное число бит; кластеризованные потоки используют коды длин серий; а энтропийная схема назначает короткие канонические коды Хаффмана частым значениям и длинные — редким.
Сборка и страховка
заголовок + блоб, либо raw-storeСпереди добавляется компактный заголовок (параметры, нужные для полного восстановления), и потоки склеиваются в итоговый архив. Если путь через куб не выигрывает у хранения входа как есть, Cubrim откатывается на raw-store — поэтому результат никогда не растёт. Декодирование точно обращает каждый шаг: без потерь, байт в байт.
Byte values 0–255 as coloured cells
Height = value magnitude
Flat 1D ribbon folds into a 2D grid
24×24 cells shown (scaled-down illustration)
Empty cells dimmed; arrows show gaps
Only populated points kept
Repeated gap bars collapse to one block
(value × count) = compact pair
Frequent values → short bit codes
Rare values → long codes (Huffman)
Streams assembled into one archive
Raw-store fallback if cube > input
Всегда без потерь
Каждый этап обратим. Декодирование читает заголовок и проходит конвейер в обратную сторону, восстанавливая исходные байты в точности — режима с потерями не существует.