关于压缩 lzh lha lzx

lha lzh lzx 都是压缩算法,lzx和lzh有明显的血缘关系,早期版本的lha压缩算法参考了lz77的部分思想,从而使得这三者都有了一定的血缘关系。
值得注意的是lha格式文件的其中一种拓展名也叫lzh,因此标题提到lzh并不是要说明lzh,而是为了解除混淆。

LHA

历史

LHA压缩算法在日本用的比较多,根据维基百科)所述,LHA原名LHarc,最初由日本的吉崎栄泰先生在1988年设计,后来经过算法重写,重写期间版本称LHx,最终完成后改名LH。而后为了避免与DOS系统下的LH命令冲突,又改名LHA。
尽管在上世纪90年代,LHA和LZX算法有竞争关系,但是由于LHA在Amiga系列计算机上的标准化,该算法在逐步趋于流行,并被移植到多种操作系统上。日语版的win7自带了LZH文件管理,非日语版的win7企业版/旗舰版则可以通过windows更新来安装日语语言包以获取自带的LZH文件管理程序。

lha使用霍夫曼编码,压缩算法从lh0开始,一直发展到lh7,以及lhd(用于指示空目录的标识方法),后来经过各方拓展,出现了更多的算法(主要是字典大小的变化)

文件格式

lha文件的编码格式可以参照这个链接 ,需要注意的是,lha文件有三种压缩level,根据上述链接,可知level0大概的框架如下

偏移 字节量 意义
0 1 header大小
1 1 header校验和
2 5 压缩算法ID
7 4 压缩后文件大小(倒序)
11 4 未压缩文件大小(倒序)
15 4 原始文件时间戳
19 1 文件或目录属性
20 1 文件名称长度,下称N
22 N 路径和文件名
22+N 2 未压缩文件的crc16(倒序)
24+N C 被压缩文件的内容
…… …… ……
END 1 文档结束标识符0x00

其余的level 1 和level 2 类似,不再一一说明,具体参照上述链接。
需要注意的是,其中的Header 校验和的计算方法是,将header部分里除前两个字节以外的其他字节的十六进制(ascii)相加,取结果的后两位。
而上述标注(倒序)的部分,指应将其中的hex前后顺序调换,如1e010203,则转为0302011e再进行计算。

拓展名

如果使用lha.exe 7-zip,则将无视拓展名,如果要使用其他压缩程序打开,可以将文件拓展名改为lha或者lzh。附录中提供lha.exe的下载地址(似乎存在bug,只能以lh0方式打包文件)


LZX

LZX)则是另外一种算法,属于LZ77压缩算法系列,LZ77系列由Jonathan ForbesTomi Poutanen共同设计。

(图片来源:http://blog.csdn.net/kimylrong/article/details/39405981)
值得一提的是,有很多文件使用了这个压缩算法,比如Amiga LZX、微软的CAB文件、CHM文件、LIT文件(CHM格式的拓展)、WIM文件,以及Xbox Live Avatars)
至于LZX文件的解压,如维基百科所述

unlzx程序可以解压Amiga LZX文档,cabextract可以用LZX方法解压微软CAB文档,如在CHM文章中所介绍的那样,有许多交叉平台的工具可以解压、浏览CHM文件。LIT文件可以使用Convert LIT软件解压。

除此之外,linux下可以调用unzip命令进行解压。

附录:

无损数据压缩算法的历史

lha.zip