bzip2库bzlib.h 使用手册(部分翻译)
2.5 内存管理#
bzip2
以块为单位压缩大文件。块的大小既影响达到的压缩率,也影响压缩和解压所需的内存量。标志 -1 到 -9 分别指定块的大小为 100,000 字节到 900,000 字节(默认)。在解压时,用于压缩的块大小会从压缩文件的头中读取,然后 bunzip2 会给自己分配足够的内存来解压文件。由于块的大小被存储在压缩文件中,因此标志 -1 到 -9 与解压时无关,所以被忽略。
压缩和解压的需求,以字节为单位,可以估计为:
压缩: 400k + ( 8 x 块大小 )
解压: 100k + ( 4 x 块大小 ) ,或 100k + ( 2.5 x 块大小 )
3.4. High-level interface#
此接口提供读取和写入bzip2
格式文件的功能。首先,一些通用的要点。
- 所有函数都采用
int*
型的第一个参数bzerror
。每次调用后,应首先查询bzerror
以确定调用的结果。如果bzerror
为BZ_OK
,则调用成功完成,只有在该情况下才能查询函数的返回值(如果有的话)。如果bzerror
是BZ_IO_ERROR
,则在读取/写入基础压缩文件时出错,然后应查询errno/perrror
以确定出错的原因。bzerror
也可以设置为各种其他值;下面根据每个函数给出了精确的细节: - 如果
bzerror
表示一个错误(即除BZ_OK
和BZ_STREAM_END
之外的任何内容),你应当立刻调用BZ2_bzReadClose
(或者BZ2_bzWriteClose
,这取决于你是尝试读取还是写入)以释放与stream相关联的全部资源。一旦指示错误,除BZ2_bzReadClose
(BZ2_bzWriteClose
)外的所有调用的行为都是undefined。这意味着(1)每次调用后都应当检查bzerror
,(2)如果bzerror
指示一个错误,然后应当调用BZ2_bzReadClose
(BZ2_bzWriteClose
)进行清理。 - 传递给
BZ2_bzReadOpen
/BZ2_bzWriteOpen
的FILE*
参数应该设置为binary模式,大多数Unix系统默认情况下都会这样做,但是其他平台,包含Windows和Mac,不会这样做。如果忽略这一点,在将代码移动到新平台时可能会遇到问题。 - 内存分配请求由malloc/free处理。目前,在文件I/O函数中没有用户定义的内存分配器的功能(尽管可以很容易地添加)。
3.4.1. BZ2_bzReadOpen#
typedef void BZFILE;
BZFILE *BZ2_bzReadOpen( int *bzerror, FILE *f,
int verbosity, int small,
void *unused, int nUnused );
准备从文件句柄f
读取压缩数据。f
应当指向一个已打开以供读取的文件,并且未设置错误指示器 (ferror(f)
)。如果参数small
设置为1,库将尝试使用更少的内存来解压缩,代价是牺牲速度。
作者:sq800
出处:https://www.cnblogs.com/sq800/p/17026928.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通