pub val WINDOW: usize = 32768
滑动窗口的大小(以字节为单位),即最大的后向引用距离
pub def Status: u8
调用在必须停止之前取得了多少进展
pub val NEED_INPUT: Status = 0
src 的每个字节都已消耗;请提供下一个块
pub val OUTPUT_FULL: Status = 1
dst 已满;请将其排空并再次调用
pub val DONE: Status = 2
流已整洁地结束
pub rec Progress;
单次解压调用所取得的进展
status:调用返回的原因 consumed:本次调用从 src 获取的字节数 written:本次调用写入 dst 的字节数
pub rec Inflater;
流式 DEFLATE 解码器状态
使用 init 创建,通过 decompress 驱动,使用 finish 确认,通过 dnit 释放。所有字段都是内部的;公开接口是下方的函数。
pub fun reset(z: *Inflater);
将解码器重置到新流的起点,同时保留窗口分配
z:要重置的解码器
pub fun init(a: *A.Allocator) R.Result[Inflater, str];
创建一个解码器,从 a 中分配其 32 KiB 的窗口
a:仅用于分配窗口的分配器 ret:一个就绪的解码器,如果无法分配窗口则返回错误
pub fun dnit(z: *Inflater) bool;
释放窗口
z:要反初始化的解码器 ret:如果窗口已释放则为 true
pub fun is_done(z: *Inflater) bool;
检查流是否到达其最终块
z:要查询的解码器 ret:一旦最后一个块完全解码完毕则为 true
pub fun finish(z: *Inflater) R.Result[bool, str];
确认流已正常结束,而不仅仅是耗尽了输入
当调用者没有更多输入时调用此函数;解码器仍在等待字节意味着流被截断了。
z:要检查的解码器 ret:如果流已完成则为 true,否则返回描述其为何未完成的错误
pub fun align_to_byte(z: *Inflater);
丢弃位直到下一个字节边界
用于在 deflate 数据之后读取字节对齐尾部的包装器。
z:要对齐的解码器
pub fun buffered_bytes(z: *Inflater) usize;
位缓冲区中仍然保留的整数字节数
解码器会进行预读,因此 deflate 数据之后的字节可能已经从 src 中消耗并存放在这里。读取尾部的包装器必须先排空这些字节,然后才能从 src 中读取更多内容。
z:要查询的解码器 ret:缓冲的整数字节数
pub fun pop_buffered(z: *Inflater) u8;
移除并返回一个缓冲的字节
仅当 buffered_bytes 非零且解码器处于字节对齐状态时有效。
z:要从中取出的解码器 ret:下一个缓冲的字节,如果没有缓冲则为 0
pub fun decompress(z: *Inflater, src: *u8, src_len: usize, dst: *u8, dst_len: usize) R.Result[Progress, str];
在 src 和 dst 允许的范围内进行尽可能多的解码
当 src 耗尽(NEED_INPUT)、dst 填满(OUTPUT_FULL)或最终块完成(DONE)时返回。根据 consumed 推进 src,根据 written 推进 dst,然后再次调用;解码器会在它停止的地方恢复。
z:由 init 创建的解码器 src:压缩字节的下一个块 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];
将整个流解压到调用者提供的缓冲区中
a:解码器窗口的分配器 src:完整的压缩流 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];
将整个流解压到一个按需增长的向量中
a:解码器窗口和输出向量的分配器 src:完整的压缩流 src_len:该流的长度 ret:拥有解压后字节的向量(调用者必须对其调用 dnit),如果流格式错误则返回错误