lha
35 年的 .lzh 归档历史,
如今以单一自包含的静态二进制分发。
静态二进制 · 在任何 Linux、macOS 或 Windows 上
都不需要安装 libc。
什么是 lha?
LHA(原名 LHarc)是 1988-1989 年由吉崎英明 (Y.Tagawa)创建的文件压缩与归档格式。它采用 LZARI/LZHUF 算法 (LZ77 + Huffman 的算术编码变体),是 1990 年代 MS-DOS 与日本个人电脑 上占主导地位的归档格式,远早于 ZIP 普及。
lha(这个二进制)支持所有常见的 LZH 变体
(-lh0-、-lh1-、-lh4-、-lh5-、
-lh6-、-lh7-、-lhx-、-lzs-,
以及 -lhd- 目录头),
加上旧式的 LArc 和 PMarc 格式。当其它工具都打不开老归档时,
lha 还能解出来。
简史
1988–1989 — LHarc 与 LZARI
吉崎英明(Y.Tagawa)在 1988-1989 年发布了面向 MS-DOS 的 原版 LHarc。它是日本最早广泛使用的归档格式, 结合了奥村晴彦最初发表的 LZARI 算术编码(LZ77 变体) 和静态 Huffman。Tagawa 的贡献是把它作为归档格式实用化。
1990–1991 — LZH 的诞生
吉崎把算法改进为 LZHUF(LZ77 + 动态 Huffman),
在 1990 年以 LHA 格式发布。归档头部把压缩方式嵌入到
文件名后缀中,这也是为什么你的老 .lzh 文件会
以 -lh5- 之类结尾的原因。现代压缩工具大多会
对用户隐藏这一点;LHA 编码器则是显式选择压缩方式。
1991–1993 — LHA for UNIX
1991 年大木优(M.Oki)把 LHA 移植到 UNIX。1993 年 绵贯和彦(N.Watazaki)接管维护并几乎完全重写了代码库, 形成了沿用至今的 LHa for UNIX。我们今天随这个二进制 一起分发的 man page 仍然在原作者署名一栏写着 M. Oki 和 N. Watazaki — 这就是同一份源码。
LHA for UNIX 使用的是一种自定义的自由软件许可证:
要求署名、禁止将衍生作品称为 "LHA"、并明确禁止未经联系作者
进行仅二进制的再分发。这也是为什么直到今天 Debian 把它
放在 non-free/contrib。
1994–2010 — ZIP 时代,2ch 风格论坛
PKZIP 2.0(1993 年)和 Info-ZIP zip(1994 年起)在西方 PC 上
取代了 LHA。在日本,.lzh 归档一直流行到 2000 年代初期 —
热门网站用 LZH 分发文件,BBS 默认附加 LZH,Windows 下
.exe 自解压包也广泛采用 LHA。2ch 风格的电子公告板
交换 LZH 文件一直延续到 2000 年代后期。
2010–2020 — 静默维护期
文件越来越大、带宽越来越便宜,LHA 那种适度的 CPU 成本不再重要。
7-Zip 的 LZMA + .7z 在压缩率上大幅领先。Watazaki 的
LHa for UNIX 树不时有小补丁,但不再有正式发布。
2022 — autoconf 复活(jca02266)
2022 年,GitHub 用户 jca02266 接手了沉寂已久的代码树,
并给它加上了现代的 autoconf 构建系统。结果就是
LHa for UNIX 1.14i-ac20220213 — 这正是本仓库
vendored 在 upstream/lha/ 下的来源。
原始 C 代码、man pages 和上游测试套件都保持原样。
jca02266 的 autoconf 工作首次让这个格式能在任何现代 Linux
发行版上即可编译。ljh-sh/lha 在此基础上进一步生成预编译
静态二进制,让终端用户连 apt install build-essential
都不必做。
支持的压缩方式
| 后缀 | 算法 | 说明 |
|---|---|---|
-lh0- | 不压缩(仅打包) | 用于快速归档。元数据头部仍然记录方式,以便旧工具 能正确解码。 |
-lh1- | LZARI(LZ77 + 算术编码) | 原始 LHarc 方法。仅原版 MS-DOS 工具链会写这种;
你今天遇到的多数归档是 -lh5-。 |
-lh4- | LZARI 变体 | 保留备用。实际很少见。 |
-lh5- | LZHUF(LZ77 + 动态 Huffman) | 默认方式。自 1990 年起的标准 LZH 格式。
当下你遇到最多 .lzh 文件用的就是这种。 |
-lh6- | LZARI + 静态 Huffman 变体 | 实验性。不常见。 |
-lh7- | LZHUF + 树变体 | 实验性。 |
-lhx- | LZH 兼容性标记 | 表示该归档使用更新的 LZH 约定,外加独立的
-lhd- 目录头部。 |
-lzs- | LZARI 变体 | 保留。 |
除压缩方式外,lha 还支持读写旧式的 LArc
和 PMarc 格式(可在 configure 时启用)。详见
lha --help。
下载
每个归档包含:
bin/lha— 二进制本身man/man1/lha.1— man 手册README.md— 安装说明
最新发布见 github.com/ljh-sh/lha/releases。
macOS / Linux 最快路径(一行命令):
x i lha # x-cmd 安装数据库(通过 x.eget 解析到 ljh-sh/lha)
x eget use lha # eget 的裸名解析器 — 等价,命中同一个 release
两者都会自动识别你的 OS + 架构,从
releases/latest
拉取对应的静态二进制,解压到 ~/.local/bin/lha,并加到
PATH。无需编译器、无需 brew tap、无需 apt-add-repo。
或者直接下载对应平台的归档:
| 平台 | 文件 | 说明 |
|---|---|---|
| Linux x86_64 | lha-x86_64-linux-musl.tar.gz |
完全静态。在任何 Linux 发行版(Alpine、Debian、RHEL、Arch…) 上都可运行。 |
| Linux ARM64 | lha-aarch64-linux-musl.tar.gz |
完全静态。用于 aarch64 Linux(如 Graviton、Ampere Altra、 64 位 Pi 4/5)。 |
| macOS Apple Silicon | lha-aarch64-macos.tar.gz |
链接器使用系统 libiconv(macOS 自带)。 |
| macOS Intel | lha-x86_64-macos.tar.gz |
同上。从 Apple Silicon 交叉编译;在 Intel Mac 上原生运行, 在 Apple Silicon 上经 Rosetta 运行。 |
| Windows x86_64 | lha-x86_64-windows.zip |
用 MinGW 构建,无需 VC++ 运行库。 |
安装(可选,手动):
tar xzf lha-x86_64-linux-musl.tar.gz
sudo install -m 0755 lha-x86_64-linux-musl/bin/lha /usr/local/bin/lha
sudo install -m 0644 lha-x86_64-linux-musl/man/man1/lha.1 /usr/local/share/man/man1/
man lha
自己编译
包装脚本是纯 POSIX shell。从仓库根目录:
git clone https://github.com/ljh-sh/lha.git
cd lha
bash scripts/build.sh # 当前架构(autoreconf + configure + make)
cd upstream/lha && bash scripts/smoke.sh # 上游 20 个测试用例
cd ../../ && bash scripts/build-alpine.sh # 在 alpine:3.20 中构建 musl-static
bash scripts/build.sh && bash scripts/smoke.sh # 本机往返测试
详见 scripts/build.sh (目标特定 flag:host / musl / MSYS2)以及 NOTICE.md (适用于 vendored 二进制的上游许可证条款)。