有人能指导我如何在低内存条件(<2k)下实现LZW压缩/解压缩吗?这可行吗?
有人能指导我如何在低内存条件(<2k)下实现LZW压缩/解压缩吗?这可行吗?
我曾经使用过 LZSS。我使用了来自 Haruhiko Okumura 的代码作为基础。它使用未压缩数据的最后一部分(2K)作为字典。如果您在内存中拥有所有未压缩的数据,则可以修改链接的代码以几乎不使用任何内存。通过一些谷歌搜索,你会找到许多不同的实现。
我最后一次使用LZW压缩算法已经超过15年了,所以请谨慎参考以下内容。
考虑到内存限制,这将是最困难的。您构建的字典将占用您可用空间的绝大部分。(假设代码+内存<=2k)
为您的字典选择一个小的固定大小。比如说1024个条目。
让每个字典条目采取以下形式....
struct entry {
intType prevIdx;
charType newChar;
};
这个结构使字典递归。你需要前一个索引的项目有效才能正常工作。这可行吗?我不确定。然而,让我们暂时假设它是可行的,并找出它将带领我们去哪里....
如果您使用int和char的标准类型,您很快就会耗尽内存。您将希望尽可能紧密地打包物品。1024个条目将占用10位来存储。您的新字符可能需要8位。总计= 18位。
18位* 1024个条目= 18432位或2304字节。
乍一看,这似乎太大了。我们该怎么办?利用前256个条目已知的事实-您典型的扩展ASCII集或其他内容。这意味着我们实际上只需要768个条目。
768 * 18位= 13824位或1728字节。
这将给您留下约320个字节的代码空间。当然,您可以尝试调整字典大小以找到适合自己的大小,但是您最终可用于代码的空间将非常有限。由于您只有很少的代码空间,我预计您最终会使用汇编语言编写代码。
希望这能有所帮助。
lzw 的最低字典是基于链表的 trie。可以在 LZW AB 中查看原始实现。我已经在 fork LZWS 中进行了重写。该 fork 与 compress
兼容。详细文档请参见 此处。
n
位字典需要 (2 ** n) * sizeof(code) + ((2 ** n) - 257) * sizeof(code) + (2 ** n) - 257
。
所以:
我的最佳建议是检查BusyBox的源代码,看看他们的LZW实现是否足够小,可以在你的环境中使用。
typedef unsigned int UINT;
typedef unsigned char BYTE;
BYTE *lzw_encode(BYTE *input ,BYTE *output, long filesize, long &totalsize);
BYTE *lzw_decode(BYTE *input ,BYTE *output, long filesize, long &totalsize);