Skip to content

About

Header-only, heap-free Raw DEFLATE encoder/decoder with a fixed 256-byte window, tailored for resource-constrained embedded systems. リソースの限られた組み込みシステム向け。固定256バイトの履歴領域、ヒープ不要のRaw DEFLATEエンコーダ/デコーダ。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

deflate256

License: MIT-0 Language: C99

Deflate256 は、リソースが極めて制限された 8/16/32 ビットマイコン向けに設計された、超軽量の DEFLATE 規格(RFC 1951)準拠の圧縮・解凍モジュールです。 標準的な DEFLATE 圧縮が持つ複雑なハッシュテーブルや動的ハフマン木を完全に排除し、組み込み環境での省メモリを極限まで追求しています。

コンセプト

通常の DEFLATE アルゴリズム(zlib や Miniz など)は、スライディングウィンドウ(履歴保持)に最大 32KB の RAM を必要とするため、リソースの限られた小型マイコン(AVR, PIC, RL78, 小型ARM など)への組み込みは困難でした。

deflate256 は、圧縮側に以下の強力な制限(縛り)を設けることで、この問題を完全に解決します。

  1. スライディングウィンドウサイズを「最大256バイト」に制限
  2. 固定ハフマン符号(Fixed Huffman)限定(動的なハフマン木の生成・解析ロジックを丸ごと削除)
  3. 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 前後に収まります。

API の使い方

1. 圧縮(エンコーダ)

元の 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));

2. 解凍(デコーダ)

圧縮された Raw DEFLATE バイト列を、元のデータに解凍します。

#include "deflate256.h"

uint8_t decomp_buf[512]; // 解凍先バッファ(過去256バイトの履歴参照を兼ねる)

// データを解凍
int result = deflate256_decode(comp_buf, comp_size, decomp_buf);
if (result == 0) {
    // 解凍成功!
}

注意事項・動作制約

本モジュールを安全かつ正しく動作させるために、以下の制約事項を必ずご確認ください。

1. 解凍時の出力先バッファ(RAM)に関する制約

  • dst(解凍先)バッファは、過去のデータを読み出す履歴ウィンドウを兼ねています。
  • そのため、Flash ROM などの読み出し専用領域や、シリアルポート等のストリーミング出力先に直接指定することはできません。
  • 必ず十分なサイズを持つ 書き換え可能な RAM 配列 を指定してください。

2. PC側での事前エンコードに関する制約

  • 本モジュールはマイコン側の軽量化を極限まで追求しているため、動的なハフマン木や標準的なZIPヘッダーなどを処理できません。
  • マイコンに組み込むデータは、事前にPC側等で「Raw DEFLATE形式 / 固定ハフマン符号 / 最大256バイトのウィンドウサイズ」という専用のルールに則ってエンコード(事前圧縮)しておく必要があります。

ライセンス

このプロジェクトはMIT-0ライセンスのもとで公開されています。詳細はLICENSEファイルをご覧ください。

  • 商用利用・個人利用を問わず、完全自由に使用できます。
  • 著作権表示やライセンス文言の保持・記載義務すらありません。
  • ソースコードの改変、流用、再配布、自社製品への組み込み等、制限なくご活用いただけます。

About

Header-only, heap-free Raw DEFLATE encoder/decoder with a fixed 256-byte window, tailored for resource-constrained embedded systems. リソースの限られた組み込みシステム向け。固定256バイトの履歴領域、ヒープ不要のRaw DEFLATEエンコーダ/デコーダ。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages