Знайомство і робота з lzma sdk

Давайте зробимо невелику перерву в справі розгляду захисту програмних продуктів від несанкціонованого використання і програмування для мобільних операційних систем і поговоримо трохи про стиснення даних. Вірніше, про одну дуже вдалою бібліотеці, яка дозволить вам додати підтримку цього самого стиснення в ваші програмні продукти.

Немає сумніву в тому, що, одного разу винайшовши стиснення даних, людство вже більше не розлучиться з цією технологією (або правильніше, мабуть, було б говорити про цілий спектр технологій, тому що стиск стиску ворожнечу). Незважаючи на те, що в стисненні без втрат, яке застосовується при зберіганні більшості типів даних, зробити щось нове дуже складно, періодично на горизонті з'являються програмні продукти і алгоритми стиснення, які намагаються запропонувати користувачам ще більшу ступінь компресії. Але виходить це, треба сказати, далеко не у всіх. Алгоритм стиснення LZMA, який лежить в основі став дуже популярним в останні роки архівного формату 7z, є щасливим винятком із цього правила. Стискає він дійсно дуже добре і при цьому є абсолютно відкритим, як, втім, і сам формат, і навіть використовує його популярний архіватор 7Zip.

Думаю, що переважна більшість наших читачів більш-менш знайомі з тим, як працюють сучасні алгоритми стиснення даних. Найпоширенішими і при цьому ефективними (і LZMA тому яскраве підтвердження) залишаються алгоритми стиснення за словником. Що це означає? Це алгоритми, які замінюють довгу послідовність байт, котра трапляється нам у файлі або в потоці даних, на коротшу. Сама довга при цьому додається в "словник", а при розпакуванні вже проводиться заміна короткого варіанту на оригінальний. За прикладами, в общем-то, далеко ходити не потрібно, тому що навіть стиснення тексту, що містить, наприклад, часто зустрічається в ньому фразу "персональний комп'ютер" за допомогою її заміни на більш коротку абревіатуру "ПК", здатне дати якийсь результат .

LZMA відноситься до словниковим алгоритмам, що базуються на старому і перевіреному часом алгоритмі Лемпеля-Зива. Взагалі назва LZMA розшифровується як Lempel-Ziv-Markov chain-Algorithm. Цей алгоритм використовує не тільки словники, але і теорію ймовірності. Головною інновацією в LZMA стало використання замість загальноприйнятої моделі, заснованої на байтах, моделі контекстів, специфічних для бітових полів в кожної словникової фразі. Більш висока ступінь компресії забезпечується відсутністю змішування непов'язаних один з одним бітів в одному контексті, але при цьому, в цілому, простота алгоритму зберігається приблизно на тому ж рівні, що і для звичайних, орієнтованих на байти, словникових алгоритмів. Також LZMA дозволяє працювати зі словником дуже великого розміру (до 4 Гб), що, власне кажучи, і дає навантаження на "оперативку".

На офіційній сторінці сайту бачимо, що в даний час цей SDK містить в собі такі речі:

  • Вихідний код C ++ для декодування і кодування LZMA
  • Сумісний з ANSI-C вихідний код для декодера LZMA
  • Вихідний код C # для декодування і кодування LZMA
  • Вихідний код Java для декодування і кодування LZMA
  • Скомпільована програма file-> file LZMA для компресії / декомпресії в Windows

Для тих, хто пише на Сі, можливо, для будь-яких вбудованих систем, напевно буде приємно дізнатися про те, що реалізований в LZMA SDK декодер LZMA використовує тільки цілочисельні інструкції і може застосовуватися будь-яким сучасним 32-бітовим процесором (або, за певних умов , 16-бітовим CPU).

Що ж, давайте подивимося на те, що ми отримаємо, коли скачати цей SDK. Оскільки всі мови відразу ми не розглянемо, то зупинимося на Java як на найпопулярнішому із запропонованих.

Фактично, в самій папці Java всередині головної папки, яку ми отримуємо, розпакувати архів з SDK, знаходяться приклади реалізації консольного архиватора на основі LZMA, - класи LzmaAlone, LzmaBench і CRC. Перший з них - це і є, власне кажучи, консольний архіватор, другий реалізує тестування упакованих даних (що теж, треба сказати, зовсім не зайве при їх розпакування, оскільки, як то кажуть, випадки бувають різні), а третій є допоміжним для підрахунку контрольної суми упакованих даних, що потрібно при перевірці їх цілісності. Код цих файлів досить простий, і, незважаючи на нагромадження різних перевірок аргументів командного рядка, розібратися, як працювати з вхідними в SDK класами, зовсім нескладно.

Думаю, що не завадить невелика ілюстрація роботи з даними в LZMA SDK. Вона, знову-таки, для Java, дана в лістингу, що супроводжує цей огляд. Я взяв цей програмний код з класу LzmaAlone і скоротив для кращої читання. Фрагмент просто ілюструє загальні принципи роботи з SDK, тому я в ньому нічого особливо пояснювати не буду, оскільки пояснення загрожують з'їсти неабияку газетну площу - впевнений, що той, хто хоча б поверхово знайомий з Java, зуміє розібратися в запропонованому коді.

Що ж, тепер залишається тільки побажати вам успіхів в роботі з LZMA SDK. Думаю, що якщо робота буде наполегливої, то і успіхи не змусять себе чекати.

Версія для друку

Схожі статті