Loading

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以确定调用的结果。如果bzerrorBZ_OK,则调用成功完成,只有在该情况下才能查询函数的返回值(如果有的话)。如果bzerrorBZ_IO_ERROR,则在读取/写入基础压缩文件时出错,然后应查询errno/perrror以确定出错的原因。bzerror也可以设置为各种其他值;下面根据每个函数给出了精确的细节:
  • 如果bzerror表示一个错误(即除BZ_OKBZ_STREAM_END之外的任何内容),你应当立刻调用BZ2_bzReadClose (或者 BZ2_bzWriteClose,这取决于你是尝试读取还是写入)以释放与stream相关联的全部资源。一旦指示错误,除BZ2_bzReadCloseBZ2_bzWriteClose)外的所有调用的行为都是undefined。这意味着(1)每次调用后都应当检查bzerror,(2)如果bzerror指示一个错误,然后应当调用BZ2_bzReadClose (BZ2_bzWriteClose)进行清理。
  • 传递给BZ2_bzReadOpen/BZ2_bzWriteOpenFILE*参数应该设置为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,库将尝试使用更少的内存来解压缩,代价是牺牲速度。

posted @ 2023-01-05 10:53  sq800  阅读(821)  评论(0编辑  收藏  举报