广民广民
工具实现揭秘转换工具

RAR/7Z 解压是怎么实现的

libarchive 编译成 WebAssembly——把 C 语言老牌库搬进浏览器

TL;DR:RAR/7Z 解压支持 RAR、7Z、TAR、GZ 四类格式(含 RAR5),在浏览器里通过 libarchive 的 WebAssembly 编译版完成——这是把一个三十年历史的 C 语言开源库原样搬进浏览器的实战案例。限制与 ZIP 解压一致,仅电脑端可用。

⏱️ 30 秒上手

  1. 打开 tools.guangmin.top/tools/archive_extract(电脑端);
  2. 选择 RAR / 7Z / TAR / GZ 文件;
  3. 条目清单展示(名称/大小),逐条下载或全部解压打包;
  4. 文件回到你的设备,全程无上传。

🔧 它是怎么实现的

三个实现要点:

  1. 为什么是 libarchive:RAR 是私有格式(官方只提供 C++ SDK)、7Z 是 LZMA 变体——自己逐格式实现不现实。libarchive 是 C 语言生态里最全的压缩格式读取库(RAR/7Z/TAR/GZ/ISO 等),把它用 Emscripten(C/C++ → WebAssembly 的编译器)编译成 .wasm,浏览器里就能跑与桌面解压软件同一套代码;
  2. Worker 隔离:WASM 解压是重计算,直接跑在页面主线程会把界面卡死。实现上把 libarchive 放进 Web Worker(浏览器的后台线程机制),主线程保持响应,解压完成后消息通知;
  3. 格式自动探测:libarchive 读文件头(magic number,文件开头几个字节的格式指纹)自动识别格式——用户不需要选「这是 RAR 还是 7Z」,丢进去就解。

📏 边界与限制

项值说明
支持格式RAR(含 RAR5)/ 7Z / TAR / GZ分卷压缩不支持
压缩包体积≤20MB—
条目数≤500防压缩炸弹
解压后总计≤200MB内存护栏
平台仅电脑端WASM 内存上限限制
加密包不支持—

🔒 隐私口径

与全套工具一致:压缩包字节只在浏览器内存与 Worker 里流转,服务器只递页面和 WASM 引擎文件(公开静态资源)。

🔗 延伸阅读

  • 引擎选型思路同源的姊妹篇:儿童入园照(MediaPipe WASM)
  • 只需要解 ZIP 的话:ZIP 解压(更轻,无需加载 WASM 引擎)