MoonBit CAB, CHM, MSZIP, and LZX archive reader
| 能力 | 状态 |
|---|---|
| CAB 文件头、Folder、File、CFDATA 解析 | 已实现 |
| CAB Stored 条目提取 | 已实现 |
| CAB MSZIP 块解压与校验 | 已实现 |
| CHM ITSF、ITSP、PMGL 目录解析 | 已实现 |
| CHM 未压缩 Section 0 条目提取 | 已实现 |
| LZX 位读取、Huffman 表、窗口、match/token 和 block header | 已实现 |
| 完整 LZX verbatim/aligned 压缩流解码 | 尚未完成,会明确返回错误 |
| 跨 cabinet 集合和写入 CAB/CHM | 不在 0.1.x 范围内 |
moon version --allmoonc v0.10.14+7d59c7ec9moon add TWISTY2Ynb/moonmspack@0.1.1git clone https://github.com/TWISTY2Ynb/moonmspack.git
cd moonmspack
moon update
moon check
moon build
moon testmoon run cmd/mainCAB: 1 entries
b"a.txt" (4 bytes)
payload: b"ABCD"let listing = @moonmspack.read_cab(cab_bytes)
println(@moonmspack.summary(listing))
let entry = listing.entries[0]
let content = @moonmspack.extract_cab_entry(cab_bytes, entry)let listing = @moonmspack.read_cab(cab_bytes)
@moonmspack.validate_listing(listing)
for entry in listing.entries {
println(entry.name + ": " + entry.size.to_string())
}
let metrics = @moonmspack.archive_metrics(listing)
println("entries=" + metrics.entry_count.to_string())let limits : @moonmspack.Limits = {
max_entries: 1000,
max_output: 16 * 1024 * 1024,
max_window: 32768,
}
let listing = @moonmspack.read_cab(cab_bytes, limits~)
match @moonmspack.find_archive_entry(listing, "b\"a.txt\"") {
Some(entry) => {
let content = @moonmspack.extract_cab_entry(cab_bytes, entry, limits~)
println(content.length())
}
None => println("entry not found")
}let (header, _) = @moonmspack.inspect_chm(chm_bytes)
let listing = @moonmspack.read_chm_entries(chm_bytes)
for entry in listing.entries {
println(entry.name)
if entry.folder == 0 {
let content = @moonmspack.extract_chm_entry(chm_bytes, header, entry)
println(content.length())
}
}moon fmt --check
moon check
moon build
moon test
moon run cmd/main| 指标 | MoonMSPack 0.1.x | 对标说明 |
|---|---|---|
| 系统命令依赖 | 0 | 不依赖 cabextract、Windows API 或外部进程 |
| 输入入口边界检查 | 公开读取/提取入口均检查 | 面向服务端不可信输入 |
| 可配置资源限制 | 条目数、输出字节、LZX 窗口 | 避免无界分配 |
| CAB / CHM 双格式 | 同一 MoonBit 包 | 对标 libmspack 的 CAB/CHM 方向 |
| 自动化验收 | check、build、test、example | 每次提交由 GitHub Actions 复现 |
| 运行目标 | MoonBit wasm 优先 | 无 C FFI,便于跨平台嵌入 |
pub suberror MspackError {
MspackError(String)
}pub struct ArchiveListing {
format : String
entries : Array[ArchiveEntry]
warnings : Array[String]
} derive(Show)fn HuffmanTable::decode(self : HuffmanTable, bits : BitReader) -> (BitReader, Int) raise MspackErrorfn chm_section(header : ChmHeader, index : Int, length : Int, limits? : Limits) -> ChmSection raise MspackErrorfn copy_range(data : Bytes, offset~ : Int, size~ : Int, limits? : Limits) -> Bytes raise MspackErrorfn decode_lzx_block(data : Bytes, window_bits~ : Int, expected~ : Int, limits? : Limits) -> Bytes raise MspackErrorfn decode_lzx_code_lengths(bits : BitReader, pretree : HuffmanTable, count : Int, previous? : Int) -> (BitReader, Array[Int]) raise MspackErrorfn decode_lzx_tree(bits : BitReader, pretree : HuffmanTable, symbols : Int) -> (BitReader, HuffmanTable) raise MspackErrorfn emit_lzx_tokens(window : LzxWindow, tokens : Array[LzxToken], limits? : Limits) -> Bytes raise MspackErrorfn extract_cab_entry(data : Bytes, entry : ArchiveEntry, limits? : Limits) -> Bytes raise MspackErrorfn extract_chm_entry(data : Bytes, header : ChmHeader, entry : ArchiveEntry, limits? : Limits) -> Bytes raise MspackErrorfn inspect_cab_blocks(data : Bytes, entry : ArchiveEntry, limits? : Limits) -> Array[CabBlock] raise MspackErrorfn list_chm_directory(data : Bytes, header : ChmHeader, directory : ChmDirectory, limits? : Limits) -> Array[ArchiveEntry] raise MspackErrorfn lzx_header_bytes() -> Intfn lzx_match_distance(slot : Int, footer : Int, recent0 : Int, recent1 : Int, recent2 : Int, window_bits : Int) -> Int raise MspackErrorfn lzx_token_from_symbols(main_symbol : Int, length_symbol : Int, distance : Int) -> LzxToken raise MspackErrorfn lzx_uses_aligned_tree(block_type : Int) -> Boolfn read_chm_section(data : Bytes, section : ChmSection, relative : Int, length : Int, limits? : Limits) -> Bytes raise MspackErrorfn validate_cab_entry_blocks(data : Bytes, entry : ArchiveEntry, limits? : Limits) -> Array[CabBlock] raise MspackError