gzip

std.compress.gzip

rec Decompressor

pub rec Decompressor;

流式 gzip 解码器状态

使用 init 创建,通过 decompress 驱动,使用 finish 确认,通过 dnit 释放。所有字段都是内部的;公开接口是下方的函数。

fun reset

pub fun reset(z: *Decompressor);

将解码器重置到新流的起点,同时保留窗口分配

z:要重置的解码器

fun init

pub fun init(a: *A.Allocator) R.Result[Decompressor, str];

创建一个解码器,从 a 中分配 inflater 的窗口

a:仅用于分配窗口的分配器 ret:一个就绪的解码器,如果无法分配窗口则返回错误

fun dnit

pub fun dnit(z: *Decompressor) bool;

释放 inflater 的窗口

z:要反初始化的解码器 ret:如果窗口已释放则为 true

fun is_done

pub fun is_done(z: *Decompressor) bool;

检查成员是否已完成且其校验和已验证

z:要查询的解码器 ret:一旦读取并匹配了尾部(trailer)则为 true

fun finish

pub fun finish(z: *Decompressor) R.Result[bool, str];

确认成员已正常结束,而不仅仅是耗尽了输入

z:要检查的解码器 ret:如果成员已完成则为 true,否则返回描述其为何未完成的错误

fun decompress

pub fun decompress(z: *Decompressor, src: *u8, src_len: usize, dst: *u8, dst_len: usize) R.Result[I.Progress, str];

srcdst 允许的范围内进行尽可能多的解码

src 耗尽(NEED_INPUT)、dst 填满(OUTPUT_FULL)、或者成员结束且其 crc32 和长度匹配(DONE)时返回。根据 consumed 推进 src,根据 written 推进 dst,然后再次调用。

z:由 init 创建的解码器 src:gzip 流的下一个块 src_len:该块的长度 dst:解压后的字节去往何处 dst_lendst 处可用的空间 ret:调用所取得的进展,或描述格式错误流的错误

fun decompress_into

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_lendst 处可用的空间 ret:已写入的字节数,如果流格式错误或放不下则返回错误

fun decompress_alloc

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),如果流格式错误则返回错误