Deflate256 は、リソースが極めて制限された 8/16/32 ビットマイコン向けに設計された、超軽量の DEFLATE 規格(RFC 1951)準拠の圧縮・解凍モジュールです。 標準的な DEFLATE 圧縮が持つ複雑なハッシュテーブルや動的ハフマン木を完全に排除し、組み込み環境での省メモリを極限まで追求しています。
通常の DEFLATE アルゴリズム(zlib や Miniz など)は、スライディングウィンドウ(履歴保持)に最大 32KB の RAM を必要とするため、リソースの限られた小型マイコン(AVR, PIC, RL78, 小型ARM など)への組み込みは困難でした。
deflate256 は、圧縮側に以下の強力な制限(縛り)を設けることで、この問題を完全に解決します。
- スライディングウィンドウサイズを「最大256バイト」に制限
- 固定ハフマン符号(Fixed Huffman)限定(動的なハフマン木の生成・解析ロジックを丸ごと削除)
- Raw DEFLATE フォーマットを採用(ZIP や GZIP などの余計なファイルヘッダーを一切付加しない)
C言語の変数型(uint8_t)が持つ「255の次に1を足すと自動で0に戻る」というハードウェアレベルの自然オーバーフロー特性を最大限にハックすることで、バッファの境界チェック(if文やビットマスク算)をコードから徹底排除し、圧倒的なROMの削減と超省メモリ化を実現しました。
- 解凍RAM消費「完全に0バイト」: 独立したウィンドウバッファ配列を定義しません。出力先のデータ配列そのものを過去の履歴(ウィンドウ)として直接使い回しながら解凍します。
- 圧縮RAM消費「わずか256バイト」: 文字列マッチング用のハッシュテーブルを一切使用しません。必要なメモリは、過去256バイトの履歴を記憶する1つの固定配列(256B)のみです。動的メモリ割り当て(
malloc)も不要です。 - 高速な総当たり(ブルートフォース)検索: 探索範囲が直近256バイトと極小であるため、重いハッシュを使わず「先頭1文字目の不一致を1命令でスキップする」技巧のみで、ハッシュ方式に迫る超高速な圧縮処理が行えます。
- MIT-0 ライセンス: 著作権表示の義務すらなく完全に自由(パブリックドメイン同等)に利用できます。商用製品のファームウェアやクローズドソースのプロジェクトにも、一切の制約なくそのまま組み込めます。
ASCIIコードのログデータ、CSV文字列、Key-Value形式のパラメータファイルなどの圧縮に最も真価を発揮します。
- ASCIIログ / パラメータファイル: 元のサイズの約 40% 〜 60%(半分前後)に圧縮可能。
- コードサイズ(ROM): エンコーダ・デコーダを合わせても、わずか約 1.5 KB 〜 2.5 KB 前後に収まります。
元の ASCIIテキストやバイナリデータを、Raw DEFLATE バイト列に圧縮します。
#include "deflate256.h"
uint8_t src_data[] = "KEY=VALUE\nKEY=VALUE\n";
uint8_t comp_buf[256];
// データを圧縮
size_t comp_size = deflate256_encode(src_data, sizeof(src_data), comp_buf, sizeof(comp_buf));圧縮された Raw DEFLATE バイト列を、元のデータに解凍します。
#include "deflate256.h"
uint8_t decomp_buf[512]; // 解凍先バッファ(過去256バイトの履歴参照を兼ねる)
// データを解凍
int result = deflate256_decode(comp_buf, comp_size, decomp_buf);
if (result == 0) {
// 解凍成功!
}本モジュールを安全かつ正しく動作させるために、以下の制約事項を必ずご確認ください。
dst(解凍先)バッファは、過去のデータを読み出す履歴ウィンドウを兼ねています。- そのため、Flash ROM などの読み出し専用領域や、シリアルポート等のストリーミング出力先に直接指定することはできません。
- 必ず十分なサイズを持つ 書き換え可能な RAM 配列 を指定してください。
- 本モジュールはマイコン側の軽量化を極限まで追求しているため、動的なハフマン木や標準的なZIPヘッダーなどを処理できません。
- マイコンに組み込むデータは、事前にPC側等で「Raw DEFLATE形式 / 固定ハフマン符号 / 最大256バイトのウィンドウサイズ」という専用のルールに則ってエンコード(事前圧縮)しておく必要があります。
このプロジェクトはMIT-0ライセンスのもとで公開されています。詳細はLICENSEファイルをご覧ください。
- 商用利用・個人利用を問わず、完全自由に使用できます。
- 著作権表示やライセンス文言の保持・記載義務すらありません。
- ソースコードの改変、流用、再配布、自社製品への組み込み等、制限なくご活用いただけます。