inflate

std.compress.inflate

val WINDOW

pub val WINDOW: usize = 32768

滑动窗口的大小(以字节为单位),即最大的后向引用距离

def Status

pub def Status: u8

调用在必须停止之前取得了多少进展

val NEED_INPUT

pub val NEED_INPUT:  Status = 0

src 的每个字节都已消耗;请提供下一个块

val OUTPUT_FULL

pub val OUTPUT_FULL: Status = 1

dst 已满;请将其排空并再次调用

val DONE

pub val DONE:        Status = 2

流已整洁地结束

rec Progress

pub rec Progress;

单次解压调用所取得的进展

status:调用返回的原因 consumed:本次调用从 src 获取的字节数 written:本次调用写入 dst 的字节数

rec Inflater

pub rec Inflater;

流式 DEFLATE 解码器状态

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

fun reset

pub fun reset(z: *Inflater);

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

z:要重置的解码器

fun init

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

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

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

fun dnit

pub fun dnit(z: *Inflater) bool;

释放窗口

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

fun is_done

pub fun is_done(z: *Inflater) bool;

检查流是否到达其最终块

z:要查询的解码器 ret:一旦最后一个块完全解码完毕则为 true

fun finish

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

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

当调用者没有更多输入时调用此函数;解码器仍在等待字节意味着流被截断了。

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

fun align_to_byte

pub fun align_to_byte(z: *Inflater);

丢弃位直到下一个字节边界

用于在 deflate 数据之后读取字节对齐尾部的包装器。

z:要对齐的解码器

fun buffered_bytes

pub fun buffered_bytes(z: *Inflater) usize;

位缓冲区中仍然保留的整数字节数

解码器会进行预读,因此 deflate 数据之后的字节可能已经从 src 中消耗并存放在这里。读取尾部的包装器必须先排空这些字节,然后才能从 src 中读取更多内容。

z:要查询的解码器 ret:缓冲的整数字节数

fun pop_buffered

pub fun pop_buffered(z: *Inflater) u8;

移除并返回一个缓冲的字节

仅当 buffered_bytes 非零且解码器处于字节对齐状态时有效。

z:要从中取出的解码器 ret:下一个缓冲的字节,如果没有缓冲则为 0

fun decompress

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

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

src 耗尽(NEED_INPUT)、dst 填满(OUTPUT_FULL)或最终块完成(DONE)时返回。根据 consumed 推进 src,根据 written 推进 dst,然后再次调用;解码器会在它停止的地方恢复。

z:由 init 创建的解码器 src:压缩字节的下一个块 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];

将整个流解压到调用者提供的缓冲区中

a:解码器窗口的分配器 src:完整的压缩流 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];

将整个流解压到一个按需增长的向量中

a:解码器窗口和输出向量的分配器 src:完整的压缩流 src_len:该流的长度 ret:拥有解压后字节的向量(调用者必须对其调用 dnit),如果流格式错误则返回错误