C言語で書かれた、ベアメタル環境・マイコンデータストリーム(12ビットADCや各種センサーなど)に特化した、極小・メモリ消費ゼロ・超高速なランレングス圧縮(RLE)エンコーダ/デコーダです。
- 圧倒的なコードサイズ: 複雑な条件分岐やインデックス計算を排除し、ポインタ演算とビット処理のみで構成された数行のコアロジック。
- メモリ(RAM)消費ゼロ: 静的・動的バッファ(
malloc等)を一切使用せず、CPUレジスタ内だけで処理が完結。 - データ肥大化の防止: データが全く連続しない最悪のケースでも、圧縮後のサイズが元のデータサイズを決して超えません(等倍を維持)。
- 32-bit CPU 最適化: 内部カウンタや戻り値に
uint32_tを採用。32ビット環境でのレジスタ処理を最速化し、65,535要素を超える巨大ストリームの処理にも対応。 - コンパイル時設定: 有効データビット数やRLEカウンタビット数を、
#defineマクロで簡単に調整可能。
ポーリング(データ蓄積)の段階であらかじめ下位の不安定なノイズビットを切り捨てておくことで、1つの16ビットの箱の中に「RLEカウンタ」と「有効データ」をギューギューに詰め込みます。
15 12 11 0
+----------------+-------------------------------+
| RLEカウンタ - 1 | 有効センサーデータ |
| (4ビット: 1-16) | (12ビット: 0-4095) |
+----------------+-------------------------------+
ヘッダファイル(rle16.h)で、事前に切り捨てられた有効センサーデータのビット幅を定義します。
#define RLE16_VALID_BITS 12 // 例:12ビットADCデータ(下位4ビットノイズ切り捨て済み)データが溜まったバッファとその個数を渡します。戻り値として、生成された圧縮パケットの正確な個数が uint32_t で返ります。
#include "rle16.h"
#define BUFFER_SIZE 1000
uint16_t raw_buffer[BUFFER_SIZE]; // 切り捨て済みの生データ (0-4095)
uint16_t comp_buffer[BUFFER_SIZE]; // 圧縮データが格納されるバッファ
void compress_sample(void) {
// 圧縮後のパケット数が uint32_t で返ります
uint32_t compressed_count = rle16_encode(raw_buffer, BUFFER_SIZE, comp_buffer);
}圧縮バッファとパケット数を渡すことで、元のデータストリームに展開します。戻り値として、復元されたデータの総数が uint32_t で返ります。1つのバッファに連続して詰め込まれたストリームデータも正確に復元可能です。
#include "rle16.h"
uint16_t decomp_buffer[BUFFER_SIZE]; // 復元データが格納されるバッファ
void decompress_sample(uint32_t compressed_count) {
// 復元された元のデータ総数が uint32_t で返ります
uint32_t restored_count = rle16_decode(comp_buffer, compressed_count, decomp_buffer);
}このプロジェクトはMIT-0ライセンスのもとで公開されています。詳細はLICENSEファイルをご覧ください。
- 商用利用・個人利用を問わず、完全自由に使用できます。
- 著作権表示やライセンス文言の保持・記載義務すらありません。
- ソースコードの改変、流用、再配布、自社製品への組み込み等、制限なくご活用いただけます。