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 — 这正是本仓库 vendoredupstream/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 还支持读写旧式的 LArcPMarc 格式(可在 configure 时启用)。详见 lha --help

下载

每个归档包含:

最新发布见 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_64lha-x86_64-linux-musl.tar.gz 完全静态。在任何 Linux 发行版(Alpine、Debian、RHEL、Arch…) 上都可运行。
Linux ARM64lha-aarch64-linux-musl.tar.gz 完全静态。用于 aarch64 Linux(如 Graviton、Ampere Altra、 64 位 Pi 4/5)。
macOS Apple Siliconlha-aarch64-macos.tar.gz 链接器使用系统 libiconv(macOS 自带)。
macOS Intellha-x86_64-macos.tar.gz 同上。从 Apple Silicon 交叉编译;在 Intel Mac 上原生运行, 在 Apple Silicon 上经 Rosetta 运行。
Windows x86_64lha-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 二进制的上游许可证条款)。