扩展库/lzma
lzma
压缩归档2026-10-29 新顶层对象检查确认 M2 主线阻断:Windows/Linux JIT 退出0;独立 EXE 均打印校验 PASS 后在退出期报状态错误、退出1。默认门禁已接入,旧函数内对象、算法互通与双语通过不覆盖该边界,暂不作完整发布签收;不提前销毁或移动全局对象绕开。
2026-10-30 修复打开态事务双故障回滚:96 组真实 C 回归在 Windows 同一最终夹具旧 8 失败→0,首因、旧目标和内存平衡保持。Windows 关闭态提交失败再遇 OOM 仍留临时文件(RFS),Linux 同例通过;默认门禁分别保留 RFS/M2 失败,不作整包签收。新增双语事务范例和各 14 条普通独立程序路径通过。
基于 7-Zip SDK 的标准 .xz 编解码,提供一次性内存、分段输入和文件流式 C/XLang API。
默认输出标准 XZ .xz 流(LZMA2 + CRC64),可与通用工具交换;解码还验证 CRC32、SHA-256、无校验、Delta 与 x86 BCJ 滤镜的外部样本。支持串联流及 4 字节对齐的零填充,拒绝不完整填充和尾随垃圾;不读取旧 .lzma 流。无校验流不检测内容损坏;CRC64 也不是内容认证。
2026-10-25 文本解压已通过拥有型 cstring 接管原解压缓冲;Windows 严格 C、标准 .xz 互通及语言 JIT/AOT 专项通过。完整 Windows 包脚本仍被项目根目录的共享 VFS 头路径问题挡住;Linux C ASan/UBSan 通过,但旧 Linux release/xl 不识别 cstring,语言阶段须待发布物重建后验收。
2026-10-26 当前 Win/Linux x64 发布版默认包门禁均通过:严格 C、Linux ASan/UBSan、Python 标准库 lzma.FORMAT_XZ 双向互通、完整 XLang JIT 与两平台各九条独立 EXE AOT。综合范例 JIT/AOT 同输出,基础范例与 C 输出一致。上段 VFS 与旧 Linux cstring 诊断是历史;公开格式只支持标准 .xz,32 位、TSan、长时压力及性能基准尚未验收。
典型场景
快速开始
import lzma
func main(...) as int
Buffer packed = lzma.compress("hello lzma")
println(lzma.decompressText(packed)) // hello lzma
auto enc = lzma.compressor()
enc.update("part1 ")
enc.update("part2")
enc.finish()
Buffer blob = enc.drain()
auto dec = lzma.decompressor()
dec.update(blob)
dec.finish()
println(dec.drain().text()) // part1 part2
return 0
end核心特性
- 压缩调优 — 级别 0..9;压缩率与耗时应按实际输入测量
- 二进制安全 — 输入输出统一
Buffer - 三种粒度 — 一次性内存、文件级、分段输入与增量解压
- 大文件流式 —
compressFile()/decompressFile();压缩器对象在finish()前暂存输入 - 进度回显 —
inputBytes/outputBytes字节计数器 - 多成员流 — 解压器
finished/members - 级别 0..9 — 0 最快、9 最高压缩率、5 默认平衡;工厂、直接类构造和 C 入口统一拒绝非法级别,负值不代表默认
- 目标提交 — 同目录临时文件,处理、flush/close 成功后才重命名;不等于断电持久性保证
2026-10-28:Windows/Linux x64 默认包级门禁通过,包含 25 组 C 原生参数负例、0..9 往返、文件失败时保护已有目标、分配故障、Linux ASan/UBSan、Python 标准 XZ 互通及双语 JIT/AOT。C 桥接头可与核心头按任意顺序包含,不主动启用宿主的 XRT VALUE 模块。该结果不代表 32 位、长时压力或性能基准认证。
包信息
| 包名 | lzma |
|---|---|
| 版本 | 1.0.0 |
| 引擎 | LZMA SDK 26.03 |
| 实现方式 | C 混编(LZMA SDK C,API 层 xlang) |
| 依赖 | 无 |
| ABI 版本 | 1 |
| 导出符号 | compress(), decompress(), decompressText(), compressFile(), decompressFile(), compressor(), decompressor(), LzmaCompressor, LzmaDecompressor, LZMA_* 常量 |
| 源文件 | extlibs/lzma/src/lzma.xl |
压缩级别常量。0 最快、9 压缩率最高、5 为默认平衡点。
API 分为一次性、文件级和分段对象。压缩器对象在 finish() 时生成一条标准 .xz 流,此前 drain() 返回空 Buffer;文件接口直接通过 XRT reader/writer 流动。解压器可边输入边 drain(),但仅在 finish() 成功后才能信任输出。
onProgress(inputBytes, totalBytes, outputBytes)。含 NUL 的源/目标路径报 ValueError;返回 false 取消,抛 CancelledError;回调异常保留首因。普通 C Reader/Writer 流使用 xrtprogressproc + userData;native 文件 ABI 使用 XRT callable,三个 uint64 参数、bool 返回,不提供 FINAL 标志。关闭态回滚的 Windows OOM 缺口仍开放。level 越界抛 ValueError;数据损坏或截断经 XRT 映射为 IOError,资源限额为 RangeError。C 的 iMaxItemBytes 是有效的解码单次分配上限,默认 256 MiB,可在分配前拒绝小输入声明的 1 GiB 字典;它不是进程总内存配额。OptionsInit 清零无关的条目、节点与深度字段,显式设置这些字段或 iFlags 会报参数错误。LZMA 不提供内容认证。教学范例
完整源文件:examples/extlibs/lzma.xl
1. 一次性 + 流式
import lzma
Buffer packed = lzma.compress("xlang lzma")
assert lzma.decompressText(packed) == "xlang lzma"
println("引擎版本: ", lzma.version())
auto encoder = lzma.compressor()
Buffer streamPacked = Buffer()
encoder.update("hello ")
encoder.update("stream")
encoder.finish()
streamPacked.append(encoder.drain())
auto decoder = lzma.decompressor()
decoder.update(streamPacked)
decoder.finish()
assert decoder.drain().text() == "hello stream"2. 最高级别 L9
import lzma
auto tuned = lzma.compressor(lzma.LZMA_MAX_LEVEL)
tuned.update("tune me")
tuned.finish()
assert lzma.decompress(tuned.drain()).text() == "tune me"以上两段对象位于顶层,当前 JIT 可运行,AOT 仍受 M2 退出边界阻断;不以正文断言通过替代自然退役。取消、回调错误保护旧目标并立即重试的双语完整例见 extlibs/lzma/examples/file_transaction.xl / file_transaction_c.c,各自创建并清理独占临时目录。
运行范例
cd release xl.exe run examples\extlibs\lzma.xl
测试覆盖
普通功能、C ASan/UBSan(Linux)、语言 JIT/普通 AOT 与 Python 标准 .xz 双向互通通过,不表示默认门禁全绿:Windows 101 阶段中 99 项符合要求,余下关闭态 RFS 与顶层 M2;Linux 此轮只剩 M2。C 入口验证选项和资源限制结构的当前完整长度、版本及零保留字段;无效选项不开始读写流。独立编码器覆盖不同校验/滤镜及混合串联,损坏次流不交付首流明文。Python 检查器在 -O 下也执行全部判据,坏流须精确返回 1、lzma 诊断且无部分输出,不将崩溃或超时视为拒绝成功。
- 一次性二进制往返(含 NUL / 0xFF)
- 流式往返 + members 计数 + finished
- 分块收集 + inputBytes 计数器
- 最高级别 LZMA_MAX_LEVEL 往返
- 级别越界抛 ValueError
- 串联多成员流
- 非法流与截断拒绝、限额错误分类
- 与 Python
lzma.FORMAT_XZ双向互通 - 文件级往返、进度与取消、overwrite 拒绝、限额失败保留原文件
- C 与 XLang 分配故障注入:内存错误分类、空结果和恢复;Linux ASan/UBSan
- 打开态 96 组双故障回滚通过;关闭态 16 组在 Windows 仍有两组残留,保留原始失败
运行测试
cd release xl.exe run extlibs\lzma\examples\basic.xl xl.exe run extlibs\lzma\examples\basic_c.c xl.exe run extlibs\lzma\examples\file_transaction.xl xl.exe run extlibs\lzma\examples\file_transaction_c.c xl.exe run extlibs\lzma\test\boundaries.xl xl.exe run extlibs\lzma\test\allocations.xl xl.exe run ..\test\cases\extlib_lzma_progress.xl