pub rec Decompressor;
流式 gzip 解码器状态
使用 init 创建,通过 decompress 驱动,使用 finish 确认,通过 dnit 释放。所有字段都是内部的;公开接口是下方的函数。
pub fun reset(z: *Decompressor);
将解码器重置到新流的起点,同时保留窗口分配
z:要重置的解码器
pub fun init(a: *A.Allocator) R.Result[Decompressor, str];
创建一个解码器,从 a 中分配 inflater 的窗口
a:仅用于分配窗口的分配器 ret:一个就绪的解码器,如果无法分配窗口则返回错误
pub fun dnit(z: *Decompressor) bool;
释放 inflater 的窗口
z:要反初始化的解码器 ret:如果窗口已释放则为 true
pub fun is_done(z: *Decompressor) bool;
检查成员是否已完成且其校验和已验证
z:要查询的解码器 ret:一旦读取并匹配了尾部(trailer)则为 true
pub fun finish(z: *Decompressor) R.Result[bool, str];
确认成员已正常结束,而不仅仅是耗尽了输入
z:要检查的解码器 ret:如果成员已完成则为 true,否则返回描述其为何未完成的错误
pub fun decompress(z: *Decompressor, src: *u8, src_len: usize, dst: *u8, dst_len: usize) R.Result[I.Progress, str];
在 src 和 dst 允许的范围内进行尽可能多的解码
当 src 耗尽(NEED_INPUT)、dst 填满(OUTPUT_FULL)、或者成员结束且其 crc32 和长度匹配(DONE)时返回。根据 consumed 推进 src,根据 written 推进 dst,然后再次调用。
z:由 init 创建的解码器 src:gzip 流的下一个块 src_len:该块的长度 dst:解压后的字节去往何处 dst_len:dst 处可用的空间 ret:调用所取得的进展,或描述格式错误流的错误
pub fun decompress_into(a: *A.Allocator, src: *u8, src_len: usize, dst: *u8, dst_len: usize) R.Result[usize, str];
将整个 gzip 成员解压到调用者提供的缓冲区中
a:解码器窗口的分配器 src:完整的 gzip 成员 src_len:该成员的长度 dst:解压后的字节去往何处 dst_len:dst 处可用的空间 ret:已写入的字节数,如果流格式错误或放不下则返回错误
pub fun decompress_alloc(a: *A.Allocator, src: *u8, src_len: usize) R.Result[V.Vector[u8], str];
将整个 gzip 成员解压到一个按需增长的向量中
a:解码器窗口和输出向量的分配器 src:完整的 gzip 成员 src_len:该成员的长度 ret:拥有解压后字节的向量(调用者必须对其调用 dnit),如果流格式错误则返回错误