工具实现揭秘转换工具
RAR/7Z 解压是怎么实现的
libarchive 编译成 WebAssembly——把 C 语言老牌库搬进浏览器
TL;DR:RAR/7Z 解压支持 RAR、7Z、TAR、GZ 四类格式(含 RAR5),在浏览器里通过 libarchive 的 WebAssembly 编译版完成——这是把一个三十年历史的 C 语言开源库原样搬进浏览器的实战案例。限制与 ZIP 解压一致,仅电脑端可用。
⏱️ 30 秒上手
- 打开 tools.guangmin.top/tools/archive_extract(电脑端);
- 选择 RAR / 7Z / TAR / GZ 文件;
- 条目清单展示(名称/大小),逐条下载或全部解压打包;
- 文件回到你的设备,全程无上传。
🔧 它是怎么实现的
三个实现要点:
- 为什么是 libarchive:RAR 是私有格式(官方只提供 C++ SDK)、7Z 是 LZMA 变体——自己逐格式实现不现实。libarchive 是 C 语言生态里最全的压缩格式读取库(RAR/7Z/TAR/GZ/ISO 等),把它用 Emscripten(C/C++ → WebAssembly 的编译器)编译成
.wasm,浏览器里就能跑与桌面解压软件同一套代码; - Worker 隔离:WASM 解压是重计算,直接跑在页面主线程会把界面卡死。实现上把 libarchive 放进 Web Worker(浏览器的后台线程机制),主线程保持响应,解压完成后消息通知;
- 格式自动探测:libarchive 读文件头(magic number,文件开头几个字节的格式指纹)自动识别格式——用户不需要选「这是 RAR 还是 7Z」,丢进去就解。
📏 边界与限制
| 项 | 值 | 说明 |
|---|---|---|
| 支持格式 | RAR(含 RAR5)/ 7Z / TAR / GZ | 分卷压缩不支持 |
| 压缩包体积 | ≤20MB | — |
| 条目数 | ≤500 | 防压缩炸弹 |
| 解压后总计 | ≤200MB | 内存护栏 |
| 平台 | 仅电脑端 | WASM 内存上限限制 |
| 加密包 | 不支持 | — |
🔒 隐私口径
与全套工具一致:压缩包字节只在浏览器内存与 Worker 里流转,服务器只递页面和 WASM 引擎文件(公开静态资源)。