您可以看看 LZO 算法,它被设计成轻量级。我不知道 AVR 系统上是否有任何实现,但这可能是您可以自己实现的东西。
然而,您对芯片 EEPROM 存储器可用空间的了解可能有些误导;根据我所持有的数据表,EEPROM 大小如下:
ATmega48P:256
ATmega88P:512
ATmega168P:512
ATmega256P:1024
请注意,这些值是以字节为单位,而不是您在问题中提到的 KB。这绝不是“很多”的存储容量。
对于嵌入式平台来说,类似LZSS的算法可能是一个不错的选择。它们是简单的算法,不需要太多的内存。
LZS是我熟悉的一种算法。它使用2 kB字典进行压缩和解压缩(字典是未压缩数据流的最近2 kB)。 (LZS由HiFn公司申请了专利,但据我所知,所有专利都已过期。)
但我发现,最近的Arduino使用的ATmega328仅具有512字节到2 kB SRAM,因此即使是LZS也可能太大了。我相信您可以使用带有较小字典的变体,但我不确定您将获得什么压缩比。
如果您只想删除一些重复的零或类似内容,请使用Run-length encoding。重复的字节序列将被存储为:
<mark><byte><count>
这是一个超级简单的算法,你可能只需要几行代码就能编写出来。
外部EEPROM(例如通过I2C)不是一个选项吗?即使使用压缩算法,缺点是您可以存储在内部EEPROM中的数据大小可能不再以简单的方式确定.. 如果您确实需要k字节,那么考虑连接到SPI的SD卡...网络上有一些轻量级开源FAT兼容文件系统。