Pure MoonBit XZ/LZMA/LZMA2 compression and decompression toolkit
请使用 0.4.4。
- 0.4.2 及更早版本有解码缺陷:解析 LZMA2 未压缩长度字段时存在进位错误, 128 KiB / 256 KiB / 1 MiB 等常见体积的合法 Python / xz-utils 输出会解码 失败;同一批版本的长度校验还存在整数溢出。请勿用它们解压外部产生的 XZ 文件
- 0.4.3 已修复上述全部缺陷,功能与 0.4.4 相同,仅缺少 Int → Int32 的写法对齐(moonc 0.10.15 起的格式化风格)
- 0.4.1 及更早版本还会在新工具链上因 implicit_impl_as_method 构建失败
构建要求 moonc 0.10.14 或更高;0.4.4 已在 moonc v0.10.15+943464bfa 上 完整验证(check --deny-warn、四个后端的 test --deny-warn、fmt --check、 bundle --all、CLI 示例、基准与互操作脚本)。详见 CHANGELOG.md。
| 功能 | 状态 |
|---|---|
| XZ stream header / footer / index 解析 | 支持 |
| 单 block 和多 block XZ stream | 支持 |
| 拼接 XZ stream 和 stream padding | 支持 |
| LZMA2 压缩块解码 | 支持 |
| LZMA2 未压缩块解码 | 支持 |
| LZMA2 range encoder 和压缩编码 | 支持 |
| Hash chain match finder | 支持 |
| 压缩级别 0-9 和字典大小参数 | 支持 |
| LZMA2 未压缩块编码和自动回退 | 支持 |
| .lzma LZMA1 旧格式解码 | 支持 |
| .lzma LZMA1 旧格式编码 | 支持 |
| CRC32 / CRC64 / SHA-256 block check | 支持 |
| 输出大小限制和错误分类 | 支持 |
| Delta filter | 支持 |
| x86 BCJ filter | 支持 |
| PowerPC / IA64 / ARM / ARM-Thumb / SPARC / ARM64 BCJ filter | 未实现,返回 Unsupported |
| 流式 Reader / Writer | 支持 |
| 有界窗口流式解码(XzStreamDecoder) | 支持 |
| 文件 CLI | 支持 |
moon add lin2077-zeming/moonxzimport {
"lin2077-zeming/moonxz/lib" @moonxz,
}fn example() -> Unit raise {
let input = b"MoonXZ quick start\n"
let encoded = @moonxz.compress(input)
let decoded = @moonxz.decompress(encoded)
println(decoded == input)
}moon run cmd/main -- demoinput_bytes=7400 xz_bytes=156 percent=2
roundtrip=true
xz_hex=fd377a585a000004e6d6b44602...let encoded = @moonxz.compress_with_check(input, @moonxz.CheckKind::Sha256)let options = @moonxz.CompressionOptions::new(
level=9,
dict_size=8 * 1024 * 1024,
filter=@moonxz.FilterMode::X86,
)
let encoded = @moonxz.compress_with_options(input, options)let writer = @moonxz.XzWriter::new()
let first = writer.write(b"first block")
let second = writer.write(b"second block")
let tail = writer.finish()
let reader = @moonxz.XzReader::new(first + second + tail)
let block = reader.read_block()let decoded = @moonxz.decompress_with_limit(encoded, 16 * 1024 * 1024)// 解压由 xz --format=lzma 或 Python lzma.compress(data, format=lzma.FORMAT_ALONE) 生成的文件
let decoded = @moonxz.decompress_lzma1(legacy)
// 写出 .lzma
let encoded = @moonxz.compress_lzma1(input)
// 读取头部信息,便于诊断
let (lc, lp, pb) = @moonxz.lzma1_properties(legacy)
let declared = @moonxz.lzma1_declared_size(legacy)| filter id | 名称 | 状态 | 验证方式 |
|---|---|---|---|
| 0x03 | delta | 支持 | liblzma 双向 |
| 0x04 | x86 | 支持 | liblzma 双向 |
| 0x05 | PowerPC | 未实现,返回 Unsupported | — |
| 0x06 | IA64 | 未实现,返回 Unsupported | — |
| 0x07 | ARM | 未实现,返回 Unsupported | — |
| 0x08 | ARM-Thumb | 未实现,返回 Unsupported | — |
| 0x09 | SPARC | 未实现,返回 Unsupported | — |
| 0x0A | ARM64 | 未实现,返回 Unsupported | — |
| 0x21 | LZMA2 | 支持 | liblzma 双向 |
moon run cmd/main -- demo
moon run cmd/main -- compress <hex> [none|crc32|crc64|sha256]
moon run cmd/main -- decompress <hex>
moon run cmd/main -- roundtrip <hex>
moon run cmd/main -- lzma-decompress <hex>
moon run cmd/main -- lzma-roundtrip <hex>
moon run cmd/main -- compress-file <input> <output> [check] [none|x86|delta]
moon run cmd/main -- decompress-file <input> <output>
moon run cmd/main -- lzma-compress-file <input> <output>
moon run cmd/main -- lzma-decompress-file <input> <output>moon test --release --target native| 内容 | MoonXZ 输出 | liblzma 输出 | 压缩速度 | 解压速度 |
|---|---|---|---|---|
| 重复文本 | 1752 B | 328 B | 约 68 MiB/s | 约 54 MiB/s |
| 半重复 | 525196 B | 525416 B | — | — |
| 随机 | 1048688 B | 1048688 B | 约 3.2 MiB/s | 约 35 MiB/s |
let decoder = @moonxz.XzStreamDecoder::new()
// 每次拿到一段压缩数据就喂进去,然后尽量取出已解出的块
decoder.supply(chunk)
loop decoder.next() {
Some(block) => handle(block)
None => break // 需要更多输入,除非已经调用 finish_input
}
// 输入结束时调用,之后 next 返回 None 即为流被截断
decoder.finish_input()moon check --deny-warn
moon test --deny-warn
moon fmt --check
moon test --target all --deny-warnmoon.mod 模块元数据
lib/moon.pkg 库包配置
lib/moonxz.mbt 公共 API
lib/xz.mbt XZ 容器解析和写入
lib/lzma1.mbt .lzma 旧格式头部、解码和编码
lib/lzma2.mbt LZMA2 chunk 解析
lib/lzma_decoder.mbt LZMA 概率模型和状态机
lib/range_decoder.mbt LZMA range decoder
lib/range_encoder.mbt LZMA range encoder
lib/lzma_encoder.mbt LZMA 编码状态机
lib/lzma2_encoder.mbt LZMA2 压缩块编码和回退
lib/match_finder.mbt Hash chain match finder
lib/filters.mbt Delta 与 x86 BCJ filter
lib/streaming.mbt 流式 Reader / Writer 与有界窗口解码器
lib/check.mbt CRC32 / CRC64 / SHA-256
lib/util.mbt 字节游标、VLI 和序列化辅助
cmd/main/ 可运行 CLI
docs/DESIGN.md 实现设计说明$xz = (moon run -q cmd/main -- compress 6869 sha256).Trim()
python -c "import lzma,sys; print(lzma.decompress(bytes.fromhex(sys.argv[1])))" $xzb'hi'Install
Download zipPure MoonBit XZ/LZMA/LZMA2 compression and decompression toolkit