我编写了一个程序来执行运行长度编码。 在典型情况下,如果文本是
AAAAAABBCDEEEEGGHJ
运行长度编码会成功
A6B2C1D1E4G2H1J1
但它为每个非重复字符添加了额外的 1。因为我用它压缩 BMP 文件,所以我想到了放置一个标记“$”来表示重复字符的出现(假设图像文件有大量的重复文本)。
看起来像
$A6$B2CD$E4$G2HJ
对于当前示例,它的长度是相同的,但对于 BMP 文件有显着差异。现在我的问题在于解码。碰巧一些 BMP 文件具有模式 $<char><num>
即$I9
在原始文件中,所以在压缩文件中我也会包含相同的文本。 $I9
,但是在解码后它会将其视为重复的 I 重复 9 次!所以它会产生错误的输出。我想知道的是我可以使用哪个符号来标记重复字符(运行)的开始,这样它就不会与原始来源冲突。
最佳答案
为什么不把原文件中的每个$
编码成压缩文件中的$$
?
和/或使用其他字符代替 $
- 在 bmp 文件中使用不多的字符。
另请注意,BMP 格式具有“内置”RLE 压缩 - 看 here ,靠近页面底部 - 在“图像数据和压缩”下。
我不知道你的程序是用来做什么的,或者只是为了学习,但是如果你使用“官方”的bmp方法,你的压缩图像在查看之前不需要解压缩。
关于language-agnostic - 实现游程编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685070/