Thư mục giải nén nodejs zlib

Sử dụng linux nói chung, CentOS nói riêng, Quản trị viên thường phải sử dụng câu lệnh. Đây cũng là điểm mạnh và cũng là điểm yếu của linux. Tuy nhiên, nếu bạn sử dụng quen thuộc giao diện dòng lệnh thì thực sự bạn mới cảm nhận được sự linh hoạt của nó trong quá trình xử lý công việc

Giải nén hoặc giải nén tệp TarBall

Để giải nén 1 tệp với công cụ tar trong linux bằng câu lệnh

tar -xvf file.tar

Thông thường để tiết kiệm dung lượng lưu trữ và băng thông tải xuống, tất cả các tệp được nén bằng công cụ nén như gzip hoặc bzip2

Phần mềm này được cung cấp 'nguyên trạng', không có bất kỳ bảo hành rõ ràng hay ngụ ý nào. Trong mọi trường hợp, các tác giả sẽ không chịu trách nhiệm cho bất kỳ thiệt hại nào phát sinh từ việc sử dụng phần mềm này

Quyền được cấp cho bất kỳ ai sử dụng phần mềm này cho bất kỳ mục đích nào, kể cả các ứng dụng thương mại, đồng thời tự do thay đổi và phân phối lại phần mềm, tuân theo các hạn chế sau

  1. Không được xuyên tạc nguồn gốc của phần mềm này; . Nếu bạn sử dụng phần mềm này trong một sản phẩm, thì việc xác nhận trong tài liệu sản phẩm sẽ được đánh giá cao nhưng không bắt buộc
  2. Các phiên bản nguồn đã thay đổi phải được đánh dấu rõ ràng như vậy và không được trình bày sai là phần mềm gốc
  3. Thông báo này không thể bị xóa hoặc thay đổi khỏi bất kỳ phân phối nguồn nào
Jean-loup Gailly       Mark Adler

Định dạng dữ liệu được sử dụng bởi thư viện zlib được mô tả bởi RFC (Yêu cầu nhận xét) 1950 đến 1952 trong các tệp rfc1950 (định dạng zlib), rfc1951 (định dạng giảm phát) và rfc1952 (định dạng gzip)

Phiên bản

#define ZLIB_VERSION "1.2.13"
#define ZLIB_VERNUM 0x12d0

Giới thiệu

Thư viện nén zlib cung cấp các chức năng nén và giải nén trong bộ nhớ, bao gồm kiểm tra tính toàn vẹn của dữ liệu không nén. Phiên bản thư viện này chỉ hỗ trợ một phương pháp nén (giảm phát) nhưng các thuật toán khác sẽ được thêm vào sau và sẽ có cùng giao diện luồng

Việc nén có thể được thực hiện trong một bước duy nhất nếu bộ đệm đủ lớn (ví dụ: nếu tệp đầu vào được mmap'ed) hoặc có thể được thực hiện bằng cách gọi hàm nén nhiều lần. Trong trường hợp sau, ứng dụng phải cung cấp thêm đầu vào và/hoặc sử dụng đầu ra (cung cấp nhiều không gian đầu ra hơn) trước mỗi cuộc gọi

Định dạng dữ liệu nén được sử dụng theo mặc định bởi các chức năng trong bộ nhớ là định dạng zlib, là một trình bao bọc zlib được ghi lại trong RFC 1950, bao quanh một luồng giảm phát, bản thân nó được ghi lại trong RFC 1951

Thư viện cũng hỗ trợ đọc và ghi tệp trong gzip (. gz) với giao diện tương tự như của stdio sử dụng các chức năng bắt đầu bằng "gz". Định dạng gzip khác với định dạng zlib. gzip là trình bao bọc gzip, được ghi lại trong RFC 1952, bao quanh một luồng giảm phát

Thư viện này cũng có thể tùy chọn đọc và ghi các luồng gzip và raw deflate trong bộ nhớ

Định dạng zlib được thiết kế nhỏ gọn và nhanh chóng để sử dụng trong bộ nhớ và trên các kênh liên lạc. Định dạng gzip được thiết kế để nén một tệp trên các hệ thống tệp, có tiêu đề lớn hơn zlib để duy trì thông tin thư mục và sử dụng phương pháp kiểm tra khác, chậm hơn zlib

Thư viện không cài đặt bất kỳ trình xử lý tín hiệu nào. Bộ giải mã kiểm tra tính nhất quán của dữ liệu nén, vì vậy thư viện sẽ không bao giờ bị lỗi ngay cả trong trường hợp đầu vào bị hỏng

Luồng cấu trúc dữ liệu

Thông tin tiêu đề
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

gzip được chuyển đến và từ các thường trình zlib. Xem RFC 1952 để biết thêm chi tiết về ý nghĩa của các trường này.

typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;

cấu trúc sử dụng

Ứng dụng phải cập nhật next_in và avail_in khi avail_in giảm xuống 0. Nó phải cập nhật next_out và avail_out khi avail_out giảm xuống 0. Ứng dụng phải khởi tạo zalloc, zfree vàopaque trước khi gọi hàm init. Tất cả các trường khác được đặt bởi thư viện nén và ứng dụng không được cập nhật

Giá trị mờ do ứng dụng cung cấp sẽ được chuyển thành tham số đầu tiên cho lệnh gọi zalloc và zfree. Điều này có thể hữu ích cho việc quản lý bộ nhớ tùy chỉnh. Thư viện nén không có ý nghĩa gì đối với giá trị mờ

zalloc phải trả về Z_NULL nếu không đủ bộ nhớ cho đối tượng. Nếu zlib được sử dụng trong ứng dụng đa luồng, zalloc và zfree phải là luồng an toàn. Trong trường hợp đó, zlib an toàn cho luồng. Khi zalloc và zfree là Z_NULL khi vào chức năng khởi tạo, chúng được đặt thành các quy trình nội bộ sử dụng các hàm thư viện chuẩn malloc() và free()

Trên các hệ thống 16 bit, các hàm zalloc và zfree phải có khả năng phân bổ chính xác 65536 byte, nhưng sẽ không bắt buộc phải phân bổ nhiều hơn mức này nếu ký hiệu MAXSEG_64K được xác định (xem zconf. h). CẢNH BÁO. Trên MSDOS, các con trỏ được trả về bởi zalloc cho các đối tượng có chính xác 65536 byte phải có phần bù của chúng được chuẩn hóa thành 0. Hàm phân bổ mặc định do thư viện này cung cấp đảm bảo điều này (xem zutil. c). Để giảm yêu cầu bộ nhớ và tránh phân bổ bất kỳ đối tượng 64K nào, làm giảm tỷ lệ nén, hãy biên dịch thư viện với -DMAX_WBITS=14 (xem zconf. h)

Các trường total_in và total_out có thể được sử dụng để thống kê hoặc báo cáo tiến độ. Sau khi nén, total_in giữ tổng kích thước của dữ liệu không nén và có thể được lưu để bộ giải nén sử dụng (đặc biệt nếu bộ giải nén muốn giải nén mọi thứ trong một bước)

hằng số

Các giá trị tuôn ra được phép; .
#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
Trả lại mã cho các chức năng nén/giải nén. Giá trị âm là lỗi, giá trị dương được sử dụng cho các sự kiện đặc biệt nhưng bình thường.
#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
Mức độ nén.
#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
Chiến lược nén — xem deflateInit2() bên dưới để biết chi tiết.
#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
Các giá trị có thể có của trường data_type cho giảm phát().
#define Z_BINARY   0
#define Z_TEXT     1
#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */
#define Z_UNKNOWN  2
Phương pháp nén xì hơi (phương pháp duy nhất được hỗ trợ trong phiên bản này).
#define Z_DEFLATED   8
Để khởi tạo zalloc, zfree, dirty.
#define ZLIB_VERSION "1.2.13"
#define ZLIB_VERNUM 0x12d0
0Để tương thích với các phiên bản < 1. 0. 2.
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

0

Chức năng cơ bản

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

1Ứng dụng có thể so sánh zlibVersion và ZLIB_VERSION về tính nhất quán. Nếu ký tự đầu tiên khác, mã thư viện thực sự được sử dụng không tương thích với zlib. h tệp tiêu đề được ứng dụng sử dụng. Việc kiểm tra này được thực hiện tự động bởi deflateInit và inflatableInit.
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

2Khởi tạo trạng thái luồng nội bộ để nén. Các trường zalloc, zfree vàopaque phải được khởi tạo trước bởi người gọi. Nếu zalloc và zfree được đặt thành Z_NULL, deflateInit sẽ cập nhật chúng để sử dụng các hàm phân bổ mặc định

Mức nén phải là Z_DEFAULT_COMPRESSION hoặc từ 0 đến 9. 1 cho tốc độ tốt nhất, 9 cho khả năng nén tốt nhất, 0 hoàn toàn không nén (dữ liệu đầu vào chỉ đơn giản là sao chép một khối tại một thời điểm). Z_DEFAULT_COMPRESSION yêu cầu thỏa hiệp mặc định giữa tốc độ và độ nén (hiện tương đương với cấp 6)

deflateInit trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_STREAM_ERROR nếu mức không phải là mức nén hợp lệ, Z_VERSION_ERROR nếu phiên bản thư viện zlib (zlib_version) không tương thích với phiên bản do người gọi giả định (ZLIB_VERSION). msg được đặt thành null nếu không có thông báo lỗi. deflateInit không thực hiện bất kỳ thao tác nén nào. điều này sẽ được thực hiện bởi deflate()

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

3deflate nén càng nhiều dữ liệu càng tốt và dừng khi bộ đệm đầu vào trống hoặc bộ đệm đầu ra đầy. Nó có thể đưa ra một số độ trễ đầu ra (đọc đầu vào mà không tạo ra bất kỳ đầu ra nào) trừ khi buộc phải xóa

Ngữ nghĩa chi tiết như sau. xì hơi thực hiện một hoặc cả hai hành động sau

  • Nén thêm đầu vào bắt đầu từ next_in và cập nhật next_in và avail_in tương ứng. Nếu không thể xử lý tất cả đầu vào (do không có đủ chỗ trong bộ đệm đầu ra), next_in và avail_in được cập nhật và quá trình xử lý sẽ tiếp tục tại thời điểm này cho lệnh gọi deflate() tiếp theo
  • Tạo thêm đầu ra bắt đầu từ next_out và cập nhật next_out và avail_out tương ứng. Hành động này là bắt buộc nếu thông số tuôn ra khác không. Buộc xả thường xuyên làm giảm tỷ lệ nén, vì vậy chỉ nên đặt tham số này khi cần thiết. Một số đầu ra có thể được cung cấp ngay cả khi tuôn ra bằng không
Trước lệnh gọi của deflate(), ứng dụng phải đảm bảo rằng ít nhất một trong các hành động có thể thực hiện được, bằng cách cung cấp thêm đầu vào và/hoặc sử dụng nhiều đầu ra hơn, đồng thời cập nhật avail_in hoặc avail_out tương ứng; . Ứng dụng có thể sử dụng đầu ra đã nén khi muốn, chẳng hạn như khi bộ đệm đầu ra đầy (avail_out == 0) hoặc sau mỗi lần gọi deflate(). Nếu giảm phát trả về Z_OK và không có avail_out, nó phải được gọi lại sau khi tạo chỗ trống trong bộ đệm vì có thể có nhiều đầu ra đang chờ xử lý. Xem deflatePending(), có thể được sử dụng nếu muốn để xác định xem có nhiều đầu ra hơn trong trường hợp đó hay không

Thông thường, tham số tuôn ra được đặt thành Z_NO_FLUSH, cho phép xả hơi quyết định lượng dữ liệu cần tích lũy trước khi tạo đầu ra, để tối đa hóa khả năng nén

Nếu thông số xóa được đặt thành Z_SYNC_FLUSH, tất cả đầu ra đang chờ xử lý sẽ được xóa vào bộ đệm đầu ra và đầu ra được căn chỉnh trên một ranh giới byte, để bộ giải nén có thể nhận được tất cả dữ liệu đầu vào có sẵn cho đến nay. (Cụ thể là avail_in bằng 0 sau cuộc gọi nếu đã cung cấp đủ dung lượng đầu ra trước cuộc gọi. ) Flushing có thể làm suy giảm khả năng nén đối với một số thuật toán nén và do đó, nó chỉ được sử dụng khi cần thiết. Điều này hoàn thành khối giảm phát hiện tại và theo sau nó là một khối được lưu trữ trống có ba bit cộng với các bit phụ cho byte tiếp theo, theo sau là bốn byte (00 00 ff ff)

Nếu flush được đặt thành Z_PARTIAL_FLUSH, tất cả đầu ra đang chờ xử lý sẽ được chuyển sang bộ đệm đầu ra, nhưng đầu ra không được căn chỉnh theo ranh giới byte. Tất cả dữ liệu đầu vào cho đến nay sẽ có sẵn cho bộ giải nén, như đối với Z_SYNC_FLUSH. Điều này hoàn thành khối giảm phát hiện tại và theo sau nó là khối mã cố định trống dài 10 bit. Điều này đảm bảo rằng có đủ byte được xuất ra để bộ giải nén hoàn thành khối trước khối mã cố định trống

Nếu flush được đặt thành Z_BLOCK, một khối giảm tốc được hoàn thành và phát ra, như đối với Z_SYNC_FLUSH, nhưng đầu ra không được căn chỉnh trên một ranh giới byte và tối đa bảy bit của khối hiện tại được giữ để ghi dưới dạng byte tiếp theo sau khối . Trong trường hợp này, bộ giải nén có thể không được cung cấp đủ bit tại thời điểm này để hoàn thành quá trình giải nén dữ liệu được cung cấp cho đến nay cho bộ nén. Có thể cần đợi khối tiếp theo được phát ra. Điều này dành cho các ứng dụng nâng cao cần kiểm soát việc phát ra các khối xì hơi

Nếu xóa được đặt thành Z_FULL_FLUSH, tất cả đầu ra sẽ được xóa như với Z_SYNC_FLUSH và trạng thái nén được đặt lại để quá trình giải nén có thể bắt đầu lại từ thời điểm này nếu dữ liệu nén trước đó bị hỏng hoặc nếu muốn truy cập ngẫu nhiên. Sử dụng Z_FULL_FLUSH quá thường xuyên có thể làm suy giảm nghiêm trọng khả năng nén

Nếu giảm phát trả về với avail_out == 0, chức năng này phải được gọi lại với cùng giá trị của thông số xóa và thêm dung lượng đầu ra ( avail_out được cập nhật), cho đến khi quá trình xóa hoàn tất (giảm phát trả về với avail_out khác không). Trong trường hợp Z_FULL_FLUSH hoặc Z_SYNC_FLUSH, hãy đảm bảo rằng avail_out lớn hơn sáu để tránh đánh dấu xóa lặp lại do avail_out == 0 khi trả về

Nếu thông số xóa được đặt thành Z_FINISH, đầu vào đang chờ xử lý sẽ được xử lý, đầu ra đang chờ xử lý sẽ được xóa và giảm phát trả về với Z_STREAM_END nếu có đủ dung lượng đầu ra. Nếu giảm phát trả về với Z_OK hoặc Z_BUF_ERROR, chức năng này phải được gọi lại với Z_FINISH và nhiều không gian đầu ra hơn (đã cập nhật avail_out) nhưng không có thêm dữ liệu đầu vào, cho đến khi nó trả về với Z_STREAM_END hoặc lỗi. Sau khi giảm phát đã trả về Z_STREAM_END, các thao tác khả thi duy nhất trên luồng là deflateReset hoặc deflateEnd

Z_FINISH có thể được sử dụng trong lệnh gọi giảm phát đầu tiên sau deflateInit nếu tất cả quá trình nén được thực hiện trong một bước. Để hoàn tất trong một lần gọi, avail_out ít nhất phải bằng giá trị do deflateBound trả về (xem bên dưới). Sau đó, giảm phát được đảm bảo trả về Z_STREAM_END. Nếu không cung cấp đủ dung lượng đầu ra, quá trình giảm phát sẽ không trả về Z_STREAM_END và nó phải được gọi lại như mô tả ở trên

deflate() đặt strm->adler thành tổng kiểm tra Adler-32 của tất cả đầu vào được đọc cho đến nay (nghĩa là byte_total_in). Nếu luồng gzip đang được tạo, thì strm->adler sẽ là tổng kiểm tra CRC-32 của đầu vào được đọc cho đến nay. (Xem deflateInit2 bên dưới. )

deflate() có thể cập nhật strm->data_type nếu nó có thể đoán đúng về kiểu dữ liệu đầu vào (Z_BINARY hoặc Z_TEXT). Nếu nghi ngờ, dữ liệu được coi là nhị phân. Trường này chỉ dành cho mục đích thông tin và không ảnh hưởng đến thuật toán nén theo bất kỳ cách nào

deflate() trả về Z_OK nếu một số tiến trình đã được thực hiện (xử lý nhiều đầu vào hơn hoặc nhiều đầu ra được tạo ra), Z_STREAM_END nếu tất cả đầu vào đã được sử dụng và tất cả đầu ra đã được tạo (chỉ khi tuôn ra được đặt thành Z_FINISH), Z_STREAM_ERROR nếu trạng thái luồng là . Lưu ý rằng Z_BUF_ERROR không gây tử vong và deflate() có thể được gọi lại với nhiều đầu vào hơn và nhiều không gian đầu ra hơn để tiếp tục nén

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

4Tất cả cấu trúc dữ liệu được cấp phát động cho luồng này đều được giải phóng. Hàm này loại bỏ mọi đầu vào chưa được xử lý và không xóa bất kỳ đầu ra đang chờ xử lý nào

deflateEnd trả về Z_OK nếu thành công, Z_STREAM_ERROR nếu trạng thái luồng không nhất quán, Z_DATA_ERROR nếu luồng bị giải phóng sớm (một số đầu vào hoặc đầu ra bị loại bỏ). Trong trường hợp lỗi, msg có thể được đặt nhưng sau đó trỏ đến một chuỗi tĩnh (không được hủy cấp phát)

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

5Khởi tạo trạng thái luồng nội bộ để giải nén. Các trường next_in, avail_in, zalloc, zfree và dirty phải được khởi tạo trước bởi người gọi. Trong phiên bản lạm phát hiện tại, đầu vào được cung cấp không được đọc hoặc sử dụng. Việc phân bổ cửa sổ trượt sẽ được hoãn lại cho lần gọi đầu tiên của quá trình thổi phồng (nếu quá trình giải nén không hoàn thành trong lần gọi đầu tiên). Nếu zalloc và zfree được đặt thành Z_NULL, thì lạm phátInit sẽ cập nhật chúng để sử dụng các chức năng phân bổ mặc định

inflatableInit trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_VERSION_ERROR nếu phiên bản thư viện zlib không tương thích với phiên bản do người gọi giả định hoặc Z_STREAM_ERROR nếu tham số không hợp lệ, chẳng hạn như con trỏ null tới cấu trúc. msg được đặt thành null nếu không có thông báo lỗi. InflateInit không thực hiện bất kỳ giải nén nào. Quá trình giải nén thực tế sẽ được thực hiện bằng lệnh inflatable(). Vì vậy, next_in và avail_in, next_out và avail_out không được sử dụng và không thay đổi. Quá trình triển khai hiện tại của inflatableInit() không xử lý bất kỳ thông tin tiêu đề nào—được hoãn lại cho đến khi inflatable() được gọi

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

6inflate giải nén càng nhiều dữ liệu càng tốt và dừng khi bộ đệm đầu vào trống hoặc bộ đệm đầu ra đầy. Nó có thể đưa ra một số độ trễ đầu ra (đọc đầu vào mà không tạo ra bất kỳ đầu ra nào) trừ khi buộc phải xóa

Ngữ nghĩa chi tiết như sau. thổi phồng thực hiện một hoặc cả hai hành động sau

  • Giải nén thêm đầu vào bắt đầu từ next_in và cập nhật next_in và avail_in tương ứng. Nếu không phải tất cả đầu vào đều có thể được xử lý (do không có đủ chỗ trong bộ đệm đầu ra), thì next_in và avail_in sẽ được cập nhật tương ứng và quá trình xử lý sẽ tiếp tục tại thời điểm này cho lần gọi tiếp theo của blow()
  • Tạo thêm đầu ra bắt đầu từ next_out và cập nhật next_out và avail_out tương ứng. thổi phồng () cung cấp càng nhiều đầu ra càng tốt, cho đến khi không còn dữ liệu đầu vào hoặc không còn dung lượng trong bộ đệm đầu ra (xem bên dưới về thông số tuôn ra)
Trước lệnh gọi của inflatable(), ứng dụng phải đảm bảo rằng ít nhất một trong các hành động có thể thực hiện được, bằng cách cung cấp thêm đầu vào và/hoặc sử dụng nhiều đầu ra hơn, đồng thời cập nhật các giá trị next_* và avail_* tương ứng. Nếu hàm gọi của hàm inflatable() không cung cấp cả không gian đầu vào và đầu ra khả dụng, thì có thể sẽ không có tiến trình nào được thực hiện. Ứng dụng có thể sử dụng đầu ra không nén khi muốn, chẳng hạn như khi bộ đệm đầu ra đầy (avail_out == 0) hoặc sau mỗi lệnh gọi của hàm inflatable(). Nếu thổi phồng trả về Z_OK và không có avail_out, nó phải được gọi lại sau khi tạo chỗ trống trong bộ đệm đầu ra vì có thể có nhiều đầu ra đang chờ xử lý

Tham số tuôn ra của inflatable() có thể là Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, Z_BLOCK hoặc Z_TREES. Z_SYNC_FLUSH yêu cầu làm tăng () xả càng nhiều đầu ra càng tốt vào bộ đệm đầu ra. Các yêu cầu Z_BLOCK thổi phồng () dừng lại nếu và khi nó đến ranh giới khối giảm phát tiếp theo. Khi giải mã định dạng zlib hoặc gzip, điều này sẽ khiến cho hàm flush() trả về ngay sau tiêu đề và trước khối đầu tiên. Khi thực hiện thổi phồng thô, thổi phồng () sẽ tiếp tục và xử lý khối đầu tiên và sẽ quay lại khi đến cuối khối đó hoặc khi hết dữ liệu

Tùy chọn Z_BLOCK hỗ trợ nối thêm hoặc kết hợp các luồng giảm phát. Để hỗ trợ việc này, khi trả về hàm flush() luôn đặt strm->data_type thành số bit không được sử dụng trong byte cuối cùng được lấy từ strm->next_in, cộng thêm 64 nếu inflatable() hiện đang giải mã khối cuối cùng trong luồng giảm phát, . Phần cuối của khối sẽ không được chỉ định cho đến khi tất cả dữ liệu không nén từ khối đó được ghi vào strm->next_out. Số lượng bit không sử dụng nói chung có thể lớn hơn 7, ngoại trừ khi bit 7 của data_type được đặt, trong trường hợp đó, số lượng bit không sử dụng sẽ nhỏ hơn 8. data_type được đặt như đã lưu ý ở đây mỗi khi hàm inflatable() trả về cho tất cả các tùy chọn xóa và do đó có thể được sử dụng để xác định lượng đầu vào hiện được tiêu thụ theo bit

Tùy chọn Z_TREES hoạt động giống như Z_BLOCK, nhưng nó cũng trả về khi đạt đến cuối mỗi tiêu đề khối giảm phát, trước khi bất kỳ dữ liệu thực tế nào trong khối đó được giải mã. Điều này cho phép người gọi xác định độ dài của tiêu đề khối giảm phát để sử dụng sau này trong truy cập ngẫu nhiên trong khối giảm phát. 256 được thêm vào giá trị của strm->data_type khi inflatable() trả về ngay sau khi đến cuối tiêu đề khối giảm phát

flush() thường được gọi cho đến khi nó trả về Z_STREAM_END hoặc lỗi. Tuy nhiên, nếu tất cả quá trình giải nén được thực hiện trong một bước duy nhất (một lần gọi tăng áp), thông số tuôn ra phải được đặt thành Z_FINISH. Trong trường hợp này, tất cả đầu vào đang chờ xử lý được xử lý và tất cả đầu ra đang chờ xử lý sẽ bị xóa; . (Kích thước của dữ liệu không nén có thể đã được máy nén lưu lại cho mục đích này. ) Không bắt buộc phải sử dụng Z_FINISH để thực hiện lạm phát trong một bước. Tuy nhiên, nó có thể được sử dụng để thông báo cho inflatable rằng có thể sử dụng một cách tiếp cận nhanh hơn cho một lệnh gọi 'inflating()'. Z_FINISH cũng thông báo thổi phồng để không duy trì cửa sổ trượt nếu luồng hoàn thành, điều này làm giảm dung lượng bộ nhớ của thổi phồng. Nếu luồng không hoàn thành, do không phải tất cả luồng đều được cung cấp hoặc không cung cấp đủ dung lượng đầu ra, thì một cửa sổ trượt sẽ được phân bổ và có thể gọi lại hàm flush() để tiếp tục hoạt động như thể Z_NO_FLUSH đã được sử dụng

Trong cách triển khai này, hãy thổi phồng () luôn chuyển càng nhiều đầu ra càng tốt vào bộ đệm đầu ra và luôn sử dụng cách tiếp cận nhanh hơn trong lần gọi đầu tiên. Vì vậy, tác động của tham số tuôn ra trong quá trình triển khai này là trên giá trị trả về của thổi phồng () như được lưu ý bên dưới, khi thổi phồng () trả về sớm khi sử dụng Z_BLOCK hoặc Z_TREES và khi thổi phồng () tránh cấp phát bộ nhớ cho cửa sổ trượt

Nếu một từ điển đặt trước là cần thiết sau cuộc gọi này (xem inflatableSetDictionary bên dưới), thổi phồng đặt strm->adler thành tổng kiểm tra Adler-32 của từ điển được máy nén chọn và trả về Z_NEED_DICT; . Ở cuối luồng, inflatable() kiểm tra xem tổng kiểm tra Adler-32 được tính toán của nó có bằng với tổng kiểm tra được máy nén lưu không và chỉ trả về Z_STREAM_END nếu tổng kiểm tra là chính xác

thổi phồng () sẽ giải nén và kiểm tra dữ liệu giảm phát được bọc zlib hoặc gzip. Loại tiêu đề được phát hiện tự động, nếu được yêu cầu khi khởi tạo với inflatableInit2(). Mọi thông tin chứa trong tiêu đề gzip sẽ không được giữ lại trừ khi sử dụng inflatableGetHeader(). Khi xử lý dữ liệu giảm tốc được gói bằng gzip, strm->adler32 được đặt thành CRC-32 của đầu ra được tạo cho đến nay. CRC-32 được kiểm tra dựa trên đoạn giới thiệu gzip, cũng như độ dài không nén, modulo 2^32

thổi phồng () trả về Z_OK nếu một số tiến trình đã được thực hiện (xử lý nhiều đầu vào hơn hoặc nhiều đầu ra hơn được tạo ra), Z_STREAM_END nếu đã đạt đến cuối dữ liệu nén và tất cả đầu ra không nén đã được tạo, Z_NEED_DICT nếu cần một từ điển đặt trước tại thời điểm này . Lưu ý rằng Z_BUF_ERROR không gây tử vong và có thể gọi lại hàm inflatable() với nhiều đầu vào hơn và nhiều không gian đầu ra hơn để tiếp tục giải nén. Nếu Z_DATA_ERROR được trả về, thì ứng dụng có thể gọi inflatableSync() để tìm kiếm một khối nén tốt nếu muốn khôi phục một phần dữ liệu

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

7Tất cả cấu trúc dữ liệu được cấp phát động cho luồng này đều được giải phóng. Hàm này loại bỏ mọi đầu vào chưa được xử lý và không xóa bất kỳ đầu ra đang chờ xử lý nào

InflateEnd trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng không nhất quán

Chức năng cao cấp

Các chức năng sau chỉ cần thiết trong một số ứng dụng đặc biệt.
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

8Đây là một phiên bản khác của deflateInit với nhiều tùy chọn nén hơn. Các trường zalloc, zfree vàopaque phải được khởi tạo trước bởi người gọi

Tham số phương thức là phương thức nén. Nó phải là Z_DEFLATED trong phiên bản thư viện này

Tham số windowBits là logarit cơ số hai của kích thước cửa sổ (kích thước của bộ đệm lịch sử). Nó phải nằm trong phạm vi 8. 15 cho phiên bản thư viện này. Các giá trị lớn hơn của tham số này dẫn đến khả năng nén tốt hơn với chi phí sử dụng bộ nhớ. Giá trị mặc định là 15 nếu deflateInit được sử dụng thay thế

Đối với việc triển khai giảm phát () hiện tại, giá trị windowBits là 8 (kích thước cửa sổ là 256 byte) không được hỗ trợ. Do đó, yêu cầu 8 sẽ dẫn đến 9 (cửa sổ 512 byte). Trong trường hợp đó, việc cung cấp 8 cho inflatableInit2() sẽ dẫn đến lỗi khi tiêu đề zlib với 9 được kiểm tra so với quá trình khởi tạo của inflatable(). Biện pháp khắc phục là không sử dụng 8 với deflateInit2() với lần khởi tạo này hoặc ít nhất trong trường hợp đó, hãy sử dụng 9 với inflatableInit2()

windowBits cũng có thể là –8. –15 cho xì hơi thô. Trong trường hợp này, -windowBits xác định kích thước cửa sổ. deflate() sau đó sẽ tạo dữ liệu deflate thô không có tiêu đề hoặc đoạn giới thiệu zlib và sẽ không tính giá trị kiểm tra

windowBits cũng có thể lớn hơn 15 đối với mã hóa gzip tùy chọn. Thêm 16 vào windowBits để viết tiêu đề và đoạn giới thiệu gzip đơn giản xung quanh dữ liệu nén thay vì trình bao bọc zlib. Tiêu đề gzip sẽ không có tên tệp, không có dữ liệu bổ sung, không có nhận xét, không có thời gian sửa đổi (đặt thành 0), không có crc tiêu đề và hệ điều hành sẽ được đặt thành giá trị thích hợp, nếu hệ điều hành được xác định tại thời điểm biên dịch. Nếu luồng gzip đang được ghi, strm->adler là CRC-32 thay vì Adler-32

Đối với mã hóa gzip hoặc giảm phát thô, yêu cầu đối với cửa sổ 256 byte bị từ chối vì không hợp lệ, vì chỉ tiêu đề zlib cung cấp phương tiện truyền kích thước cửa sổ tới bộ giải nén

Tham số memLevel chỉ định dung lượng bộ nhớ sẽ được phân bổ cho trạng thái nén bên trong. memLevel=1 sử dụng bộ nhớ tối thiểu nhưng chậm và giảm tỷ lệ nén; . Giá trị mặc định là 8. Xem zconf. h để biết tổng mức sử dụng bộ nhớ dưới dạng chức năng của windowBits và memLevel

Tham số chiến lược được sử dụng để điều chỉnh thuật toán nén. Sử dụng giá trị Z_DEFAULT_STRATEGY cho dữ liệu thông thường, Z_FILTERED cho dữ liệu do bộ lọc (hoặc công cụ dự đoán) tạo ra, Z_HUFFMAN_ONLY để chỉ buộc mã hóa Huffman (không khớp chuỗi) hoặc Z_RLE để giới hạn khoảng cách khớp thành một (mã hóa độ dài chạy). Dữ liệu được lọc bao gồm hầu hết các giá trị nhỏ với phân phối hơi ngẫu nhiên. Trong trường hợp này, thuật toán nén được điều chỉnh để nén chúng tốt hơn. Tác dụng của Z_FIltered là buộc phải mã hóa Huffman nhiều hơn và khớp chuỗi ít hơn; . Z_RLE được thiết kế để có tốc độ gần bằng Z_HUFFMAN_ONLY, nhưng nén tốt hơn cho dữ liệu hình ảnh PNG. Thông số chiến lược chỉ ảnh hưởng đến tỷ lệ nén chứ không ảnh hưởng đến tính chính xác của đầu ra được nén ngay cả khi nó không được đặt phù hợp. Z_FIXED ngăn chặn việc sử dụng mã Huffman động, cho phép bộ giải mã đơn giản hơn cho các ứng dụng đặc biệt

deflateInit2 trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_STREAM_ERROR nếu tham số không hợp lệ (chẳng hạn như phương thức không hợp lệ) hoặc Z_VERSION_ERROR nếu phiên bản thư viện zlib (zlib_version) không tương thích với phiên bản do người gọi giả định (ZLIB_VERSION). msg được đặt thành null nếu không có thông báo lỗi. deflateInit2 không thực hiện bất kỳ thao tác nén nào. điều này sẽ được thực hiện bởi deflate()

typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
typedef void   (*free_func)  OF((voidpf opaque, voidpf address));

struct internal_state;

typedef struct z_stream_s {
    z_const Bytef *next_in;     /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total number of input bytes read so far */

    Bytef    *next_out; /* next output byte will go here */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total number of bytes output so far */

    z_const char *msg;  /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */

    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */

    int     data_type;  /* best guess about the data type: binary or text
                           for deflate, or the decoding state for inflate */
    uLong   adler;      /* Adler-32 or CRC-32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;

typedef z_stream FAR *z_streamp;

9Khởi tạo từ điển nén từ chuỗi byte đã cho mà không tạo ra bất kỳ đầu ra nén nào. Hàm này phải được gọi ngay sau deflateInit, deflateInit2 hoặc deflateReset, trước bất kỳ lệnh gọi nào của deflate. Bộ nén và bộ giải nén phải sử dụng chính xác cùng một từ điển (xem inflatableSetDictionary). mà không tạo ra bất kỳ đầu ra nén nào. Khi sử dụng định dạng zlib, chức năng này phải được gọi ngay sau deflateInit, deflateInit2 hoặc deflateReset và trước bất kỳ lệnh gọi nào của deflate. Khi thực hiện giảm phát thô, chức năng này phải được gọi trước bất kỳ lệnh giảm phát nào hoặc ngay sau khi hoàn thành khối giảm phát, i. e. sau khi tất cả đầu vào đã được sử dụng và tất cả đầu ra đã được phân phối khi sử dụng bất kỳ tùy chọn xả nào Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH hoặc Z_FULL_FLUSH. Bộ nén và bộ giải nén phải sử dụng chính xác cùng một từ điển (xem inflatableSetDictionary)

Từ điển phải bao gồm các chuỗi (chuỗi byte) có khả năng gặp phải sau này trong dữ liệu được nén, với các chuỗi được sử dụng phổ biến nhất tốt nhất nên đặt ở cuối từ điển. Sử dụng từ điển hữu ích nhất khi dữ liệu được nén ngắn và có thể dự đoán với độ chính xác cao;

Tùy thuộc vào kích thước của cấu trúc dữ liệu nén được chọn bởi deflateInit hoặc deflateInit2, một phần của từ điển có thể bị loại bỏ, ví dụ nếu từ điển lớn hơn kích thước cửa sổ trong deflateInit hoặc deflateInit2. Do đó, các chuỗi có khả năng hữu ích nhất nên được đặt ở cuối từ điển, không phải ở phía trước. Ngoài ra, việc triển khai giảm phát hiện tại sẽ sử dụng tối đa kích thước cửa sổ trừ đi 262 byte của từ điển được cung cấp

Khi trả về chức năng này, strm->adler được đặt thành giá trị Adler-32 của từ điển; . (Giá trị Adler-32 áp dụng cho toàn bộ từ điển ngay cả khi chỉ một tập hợp con của từ điển được máy nén thực sự sử dụng. ) Nếu yêu cầu giảm phát thô, thì giá trị Adler-32 không được tính và strm->adler không được đặt

deflateSetDictionary trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu tham số không hợp lệ (chẳng hạn như từ điển NULL) hoặc trạng thái luồng không nhất quán (ví dụ: nếu deflate đã được gọi cho luồng này hoặc nếu không ở ranh giới khối đối với deflate thô). deflateSetDictionary không thực hiện bất kỳ thao tác nén nào. điều này sẽ được thực hiện bởi deflate()


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
0Trả về từ điển trượt đang được duy trì bằng cách giảm phát. dictLength được đặt thành số byte trong từ điển và nhiều byte đó được sao chép vào từ điển. từ điển phải có đủ dung lượng, trong đó 32768 byte luôn đủ. Nếu deflateGetDictionary() được gọi với từ điển bằng Z_NULL, thì chỉ có độ dài từ điển được trả về và không có gì được sao chép. Tương tự, nếu dictLength là Z_NULL, thì nó không được đặt

deflateGetDictionary() có thể trả về độ dài nhỏ hơn kích thước cửa sổ, ngay cả khi đã cung cấp nhiều hơn kích thước cửa sổ trong đầu vào. Nó có thể trả về ít hơn tới 258 byte trong trường hợp đó, do cách triển khai giảm phát của zlib quản lý cửa sổ trượt và tìm kiếm các kết quả khớp, trong đó các kết quả khớp có thể dài tới 258 byte. Nếu ứng dụng cần byte đầu vào có kích thước cửa sổ cuối cùng, thì ứng dụng đó sẽ cần được lưu bên ngoài zlib

deflateGetDictionary trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng không nhất quán


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
1Đặt luồng đích dưới dạng bản sao hoàn chỉnh của luồng nguồn

Chức năng này có thể hữu ích khi một số chiến lược nén sẽ được thử, chẳng hạn như khi có một số cách xử lý trước dữ liệu đầu vào bằng bộ lọc. Sau đó, các luồng sẽ bị loại bỏ sẽ được giải phóng bằng cách gọi deflateEnd. Lưu ý rằng deflateCopy sao chép trạng thái nén bên trong có thể khá lớn, vì vậy chiến lược này chậm và có thể tiêu tốn nhiều bộ nhớ

deflateCopy trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán (chẳng hạn như zalloc là NULL). msg không thay đổi ở cả nguồn và đích


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
2Hàm này tương đương với deflateEnd theo sau là deflateInit, nhưng không giải phóng và phân bổ lại trạng thái nén bên trong. Luồng sẽ giữ nguyên mức độ nén và bất kỳ thuộc tính nào khác có thể đã được đặt không thay đổi

deflateReset trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán (chẳng hạn như zalloc hoặc trạng thái là NULL)

________ 33 Tự động cập nhật mức độ nén và chiến lược hiểu. Việc giải thích cấp độ và chiến lược giống như trong deflateInit2(). Điều này có thể được sử dụng để chuyển đổi giữa nén và sao chép trực tiếp dữ liệu đầu vào hoặc để chuyển sang một loại dữ liệu đầu vào khác yêu cầu một chiến lược khác. Nếu phương pháp nén (là một chức năng của cấp độ) hoặc chiến lược bị thay đổi và nếu có bất kỳ lệnh gọi deflate() nào kể từ khi trạng thái được khởi tạo hoặc đặt lại, thì đầu vào có sẵn cho đến nay sẽ được nén với cấp độ cũ và . Có ba cách tiếp cận cho các mức nén 0, 1. 3 và 4. 9 tương ứng. Cấp độ và chiến lược mới sẽ có hiệu lực ở lần gọi deflate() tiếp theo

Nếu một quá trình giảm tốc (strm, Z_BLOCK) được thực hiện bởi deflateParams() và nó không có đủ dung lượng đầu ra để hoàn tất, thì thay đổi tham số sẽ không có hiệu lực. Trong trường hợp này, deflateParams() có thể được gọi lại với cùng tham số và nhiều không gian đầu ra hơn để thử lại

Để đảm bảo thay đổi các tham số trong lần thử đầu tiên, luồng giảm phát phải được xóa bằng cách sử dụng khử phát () với Z_BLOCK hoặc yêu cầu xóa khác cho đến khi strm. avail_out không bằng 0, trước khi gọi deflateParams(). Sau đó, không cần cung cấp thêm dữ liệu đầu vào nào trước lệnh gọi deflateParams(). Nếu điều này được thực hiện, cấp độ và chiến lược cũ sẽ được áp dụng cho dữ liệu được nén trước deflateParams(), và cấp độ và chiến lược mới sẽ được áp dụng cho dữ liệu được nén sau deflateParams()

deflateParams trả về Z_OK nếu thành công, Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán hoặc nếu tham số không hợp lệ hoặc Z_BUF_ERROR nếu không có đủ dung lượng đầu ra để hoàn tất quá trình nén dữ liệu đầu vào có sẵn trước khi thay đổi chiến lược hoặc cách tiếp cận. Lưu ý rằng trong trường hợp Z_BUF_ERROR, các tham số không bị thay đổi. Giá trị trả về của Z_BUF_ERROR không gây tử vong, trong trường hợp đó, deflateParams() có thể được thử lại với nhiều không gian đầu ra hơn


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
4Tinh chỉnh các tham số nén bên trong của xì hơi. Điều này chỉ nên được sử dụng bởi những người hiểu thuật toán được sử dụng bởi deflate của zlib để tìm kiếm chuỗi phù hợp nhất và thậm chí sau đó chỉ bởi trình tối ưu hóa cuồng tín nhất đang cố gắng vắt kiệt bit nén cuối cùng cho dữ liệu đầu vào cụ thể của họ. Đọc xì hơi. mã nguồn c để biết ý nghĩa của các tham số max_lazy, good_length, nice_length và max_chain

deflateTune() có thể được gọi sau deflateInit() hoặc deflateInit2() và trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu luồng giảm phát không hợp lệ


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
5deflateBound() trả về giới hạn trên của kích thước được nén sau khi giảm phát các byte nguồnLen. Nó phải được gọi sau deflateInit() hoặc deflateInit2(). Điều này sẽ được sử dụng để phân bổ bộ đệm đầu ra cho giảm phát trong một lần chạy và do đó sẽ được gọi trước deflate(). Nếu lệnh gọi deflate() đầu tiên đó được cung cấp các byte đầu vào sourceLen, bộ đệm đầu ra được phân bổ cho kích thước được trả về bởi deflateBound() và giá trị tuôn ra Z_FINISH, thì deflate() được đảm bảo trả về Z_STREAM_END. Lưu ý rằng kích thước nén có thể lớn hơn giá trị được trả về bởi deflateBound() nếu các tùy chọn tuôn ra khác với Z_FINISH hoặc Z_NO_FLUSH được sử dụng.

typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
6deflatePending() trả về số byte và bit của đầu ra đã được tạo nhưng chưa được cung cấp trong đầu ra khả dụng. Các byte không được cung cấp sẽ là do không gian đầu ra có sẵn đã được sử dụng. Số lượng bit đầu ra không được cung cấp nằm trong khoảng từ 0 đến 7, trong đó chúng chờ thêm bit để nối chúng để điền vào một byte đầy đủ. Nếu các bit đang chờ xử lý hoặc các bit là Z_NULL, thì các giá trị đó không được đặt

deflatePending trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
7deflatePrime() chèn các bit vào luồng đầu ra giảm phát. Mục đích là chức năng này được sử dụng để bắt đầu đầu ra giảm phát với các bit còn lại từ luồng giảm phát trước đó khi nối thêm vào nó. Do đó, chức năng này chỉ có thể được sử dụng để giảm phát thô và phải được sử dụng trước lệnh gọi deflate() đầu tiên sau deflateInit2() hoặc deflateReset(). các bit phải nhỏ hơn hoặc bằng 16 và nhiều bit có giá trị nhỏ nhất sẽ được chèn vào đầu ra

deflatePrime trả về Z_OK nếu thành công, Z_BUF_ERROR nếu không có đủ chỗ trong bộ đệm bên trong để chèn bit hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
8deflateSetHeader() cung cấp thông tin tiêu đề gzip khi luồng gzip được yêu cầu bởi deflateInit2(). deflateSetHeader() có thể được gọi sau deflateInit2() hoặc deflateReset() và trước lệnh gọi đầu tiên của deflate(). Thông tin văn bản, thời gian, hệ điều hành, trường bổ sung, tên và nhận xét trong cấu trúc gz_header đã cung cấp được ghi vào tiêu đề gzip (xflag bị bỏ qua — các cờ bổ sung được đặt theo mức độ nén). Người gọi phải đảm bảo rằng, nếu không phải là Z_NULL, tên và nhận xét sẽ được kết thúc bằng byte 0 và nếu phần bổ sung không phải là Z_NULL, thì các byte bổ sung đó có sẵn ở đó. Nếu hcrc là true, crc tiêu đề gzip được bao gồm. Lưu ý rằng các phiên bản hiện tại của phiên bản dòng lệnh của gzip (cho đến phiên bản 1. 3. x) không hỗ trợ crc tiêu đề và sẽ báo cáo rằng đó là "tệp gzip nhiều phần" và bỏ cuộc

Nếu không sử dụng deflateSetHeader, tiêu đề gzip mặc định có văn bản sai, thời gian được đặt thành 0 và hệ điều hành được đặt thành 255, không có trường bổ sung, tên hoặc nhận xét. Tiêu đề gzip được trả về trạng thái mặc định bởi deflateReset()

deflateSetHeader trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán


typedef struct gz_header_s {
    int     text;       /* true if compressed data believed to be text */
    uLong   time;       /* modification time */
    int     xflags;     /* extra flags (not used when writing a gzip file) */
    int     os;         /* operating system */
    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */
    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */
    uInt    extra_max;  /* space at extra (only when reading header) */
    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */
    uInt    name_max;   /* space at name (only when reading header) */
    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */
    uInt    comm_max;   /* space at comment (only when reading header) */
    int     hcrc;       /* true if there was or will be a header crc */
    int     done;       /* true when done reading gzip header (not used
                           when writing a gzip file) */
} gz_header;

typedef gz_header FAR *gz_headerp;
9Đây là một phiên bản khác của inflatableInit với một tham số bổ sung. Các trường next_in, avail_in, zalloc, zfree và dirty phải được khởi tạo trước bởi người gọi

Tham số windowBits là logarit cơ số hai của kích thước cửa sổ tối đa (kích thước của bộ đệm lịch sử). Nó phải nằm trong phạm vi 8. 15 cho phiên bản thư viện này. Giá trị mặc định là 15 nếu sử dụng blowjobInit thay thế. windowBits phải lớn hơn hoặc bằng giá trị windowBits được cung cấp cho deflateInit2() trong khi nén hoặc giá trị này phải bằng 15 nếu deflateInit2() không được sử dụng. Nếu một luồng nén có kích thước cửa sổ lớn hơn được cung cấp làm đầu vào, thì tính năng thổi phồng () sẽ trả về với mã lỗi Z_DATA_ERROR thay vì cố gắng phân bổ một cửa sổ lớn hơn

windowBits cũng có thể bằng 0 để yêu cầu lạm phát sử dụng kích thước cửa sổ trong tiêu đề zlib của luồng nén

windowBits cũng có thể là –8. –15 cho thổi phồng thô. Trong trường hợp này, -windowBits xác định kích thước cửa sổ. Inflate() sau đó sẽ xử lý dữ liệu giảm phát thô, không tìm kiếm tiêu đề zlib hoặc gzip, không tạo giá trị kiểm tra và không tìm kiếm bất kỳ giá trị kiểm tra nào để so sánh ở cuối luồng. Điều này được sử dụng với các định dạng khác sử dụng định dạng dữ liệu nén giảm phát, chẳng hạn như zip. Các định dạng đó cung cấp các giá trị kiểm tra của riêng chúng. Nếu định dạng tùy chỉnh được phát triển bằng cách sử dụng định dạng giảm tốc thô cho dữ liệu nén, bạn nên áp dụng giá trị kiểm tra như Adler-32 hoặc CRC-32 cho dữ liệu không nén như được thực hiện trong zlib, gzip và zip . Đối với hầu hết các ứng dụng, định dạng zlib nên được sử dụng như là. Lưu ý rằng các nhận xét ở trên về việc sử dụng deflateInit2() áp dụng cho độ lớn của windowBits

windowBits cũng có thể lớn hơn 15 để giải mã gzip tùy chọn. Thêm 32 vào windowBits để bật giải mã zlib và gzip với tính năng phát hiện tiêu đề tự động hoặc thêm 16 để chỉ giải mã định dạng gzip (định dạng zlib sẽ trả về Z_DATA_ERROR). Nếu luồng gzip đang được giải mã, strm->adler là CRC-32 thay vì Adler-32. Không giống như tiện ích gunzip và gzread() (xem bên dưới), inflatable() sẽ không tự động giải mã các thành viên gzip được nối. thổi phồng () sẽ trả về Z_STREAM_END ở cuối thành viên gzip. Trạng thái sẽ cần được đặt lại để tiếp tục giải mã thành viên gzip tiếp theo. Điều này phải được thực hiện nếu có nhiều dữ liệu hơn sau thành viên gzip, để quá trình giải nén tuân thủ tiêu chuẩn gzip (RFC 1952)

InflateInit2 trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_VERSION_ERROR nếu phiên bản thư viện zlib không tương thích với phiên bản do người gọi giả định, Z_STREAM_ERROR nếu tham số không hợp lệ, chẳng hạn như con trỏ null tới cấu trúc. msg được đặt thành null nếu không có thông báo lỗi. inflatableInit2 không thực hiện bất kỳ giải nén nào ngoài việc đọc tiêu đề zlib nếu có. giải nén thực tế được thực hiện bằng cách thổi phồng (). (Vì vậy, next_in và avail_in có thể được sửa đổi, nhưng next_out và avail_out không được sử dụng và không thay đổi. ) Quá trình triển khai hiện tại của inflatableInit2() không xử lý bất kỳ thông tin tiêu đề nào—thông tin này được hoãn lại cho đến khi thổi phồng() được gọi

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
0Khởi tạo từ điển giải nén từ chuỗi byte không nén đã cho. Hàm này phải được gọi ngay sau lệnh gọi thổi phồng, nếu lệnh gọi đó trả về Z_NEED_DICT. Từ điển được máy nén chọn có thể được xác định từ giá trị Adler-32 được trả về bởi lệnh gọi thổi phồng đó. Bộ nén và bộ giải nén phải sử dụng chính xác cùng một từ điển (xem deflateSetDictionary). Đối với thổi phồng thô, chức năng này có thể được gọi bất cứ lúc nào để đặt từ điển. Nếu từ điển được cung cấp nhỏ hơn cửa sổ và đã có dữ liệu trong cửa sổ, thì từ điển được cung cấp sẽ sửa đổi những gì ở đó. Ứng dụng phải đảm bảo rằng từ điển được sử dụng để nén được cung cấp

inflatableSetDictionary trả về Z_OK nếu thành công, Z_STREAM_ERROR nếu tham số không hợp lệ (chẳng hạn như từ điển NULL) hoặc trạng thái luồng không nhất quán, Z_DATA_ERROR nếu từ điển đã cho không khớp với từ điển dự kiến ​​(giá trị Adler-32 không chính xác). inflatableSetDictionary không thực hiện bất kỳ giải nén nào. điều này sẽ được thực hiện bởi các cuộc gọi tiếp theo của 'inflating()'

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
1Trả về từ điển trượt đang được duy trì bằng cách thổi phồng. dictLength được đặt thành số byte trong từ điển và nhiều byte đó được sao chép vào từ điển. từ điển phải có đủ dung lượng, trong đó 32768 byte luôn đủ. Nếu thổi phồngGetDictionary() được gọi với từ điển bằng Z_NULL, thì chỉ có độ dài từ điển được trả về và không có gì được sao chép. Tương tự, nếu dictLength là Z_NULL, thì nó không được đặt

inflatableGetDictionary trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng không nhất quán

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
2Bỏ qua dữ liệu nén không hợp lệ cho đến khi có thể tìm thấy điểm tuôn ra đầy đủ (xem bên trên để biết mô tả về giảm phát với Z_FULL_FLUSH) hoặc cho đến khi bỏ qua tất cả đầu vào khả dụng. Không có đầu ra được cung cấp

InflateSync tìm kiếm mẫu 00 00 FF FF trong dữ liệu nén. Tất cả các điểm xả hoàn toàn đều có mẫu này, nhưng không phải tất cả các lần xuất hiện của mẫu này đều là các điểm xả hoàn toàn

InflateSync trả về Z_OK nếu có thể tìm thấy điểm tuôn ra đầy đủ, Z_BUF_ERROR nếu không cung cấp thêm đầu vào, Z_DATA_ERROR nếu không tìm thấy điểm tuôn ra nào, hoặc Z_STREAM_ERROR nếu cấu trúc luồng không nhất quán. Trong trường hợp thành công, ứng dụng có thể lưu giá trị hiện tại của total_in, giá trị này cho biết nơi tìm thấy dữ liệu nén hợp lệ. Trong trường hợp xảy ra lỗi, ứng dụng có thể gọi lại đồng bộ hóa lạm phát nhiều lần, mỗi lần cung cấp thêm dữ liệu đầu vào cho đến khi thành công hoặc kết thúc dữ liệu đầu vào

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
3Đặt luồng đích dưới dạng bản sao hoàn chỉnh của luồng nguồn

Chức năng này có thể hữu ích khi truy cập ngẫu nhiên vào một luồng lớn. Lần đầu tiên đi qua luồng có thể ghi lại trạng thái tăng theo định kỳ, cho phép bắt đầu lại quá trình tăng ở những điểm đó khi truy cập ngẫu nhiên vào luồng

InflateCopy trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán (chẳng hạn như zalloc là NULL). msg không thay đổi ở cả nguồn và đích

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
4Hàm này tương đương với InflateEnd theo sau InflateInit, nhưng không giải phóng và phân bổ lại trạng thái giải nén bên trong. Luồng sẽ giữ các thuộc tính có thể đã được thiết lập bởi inflatableInit2

InflateReset trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán (chẳng hạn như zalloc hoặc trạng thái là NULL)

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
5Chức năng này giống như InflateReset, nhưng nó cũng cho phép thay đổi các yêu cầu kích thước cửa sổ và bao bọc. Tham số windowBits được diễn giải giống như đối với inflatableInit2. Nếu kích thước cửa sổ bị thay đổi, thì bộ nhớ được phân bổ cho cửa sổ sẽ được giải phóng và cửa sổ sẽ được phân bổ lại bằng cách thổi phồng () nếu cần

InflateReset2 trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán (chẳng hạn như zalloc hoặc trạng thái là Z_NULL) hoặc nếu tham số windowBits không hợp lệ

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
6Hàm này chèn bit vào luồng đầu vào thổi phồng. Mục đích là chức năng này được sử dụng để bắt đầu thổi phồng ở vị trí bit ở giữa byte. Các bit được cung cấp sẽ được sử dụng trước khi bất kỳ byte nào được sử dụng từ next_in. Chức năng này chỉ nên được sử dụng với thổi phồng thô và nên được sử dụng trước lệnh gọi thổi phồng () đầu tiên sau khi thổi phồngInit2 () hoặc thổi phồngReset (). các bit phải nhỏ hơn hoặc bằng 16 và nhiều bit có giá trị nhỏ nhất sẽ được chèn vào đầu vào

Nếu các bit là số âm, thì bộ đệm bit của luồng đầu vào sẽ được làm trống. Sau đó, có thể gọi lại inflatablePrime() để đặt các bit vào bộ đệm. Điều này được sử dụng để xóa các bit còn sót lại sau khi nạp mô tả khối trước khi nạp mã thổi phồng

InflatePrime trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
7Hàm này trả về hai giá trị, một ở 16 bit thấp hơn của giá trị trả về và giá trị còn lại ở các bit cao hơn còn lại, thu được bằng cách dịch chuyển giá trị trả về xuống 16 bit. Nếu giá trị trên là –1 và giá trị dưới bằng 0, thì hiện tại thì tính năng thổi phồng () đang giải mã thông tin bên ngoài khối. Nếu giá trị trên là –1 và giá trị dưới khác 0, thì lạm phát nằm ở giữa khối được lưu trữ, với giá trị thấp hơn bằng số byte từ đầu vào còn lại để sao chép. Nếu giá trị trên không phải là –1, thì đó là số bit trở lại từ vị trí bit hiện tại trong đầu vào của mã (cặp chữ hoặc độ dài/khoảng cách) hiện đang được xử lý. Trong trường hợp đó, giá trị thấp hơn là số byte đã được phát ra cho mã đó

Một mã đang được xử lý nếu lạm phát đang đợi thêm đầu vào để hoàn thành giải mã mã hoặc nếu nó đã hoàn thành giải mã nhưng đang đợi thêm dung lượng đầu ra để ghi dữ liệu bằng chữ hoặc dữ liệu khớp

inflatableMark() được sử dụng để đánh dấu các vị trí trong dữ liệu đầu vào để truy cập ngẫu nhiên, có thể ở các vị trí bit và để lưu ý những trường hợp đầu ra của mã có thể vượt qua ranh giới của các khối truy cập ngẫu nhiên. Vị trí hiện tại trong luồng đầu vào có thể được xác định từ avail_in và data_type như đã lưu ý trong phần mô tả cho thông số tuôn ra Z_BLOCK để thổi phồng

inflatableMark trả về giá trị được lưu ý ở trên hoặc –65536 nếu trạng thái luồng nguồn được cung cấp không nhất quán

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
8inflateGetHeader() yêu cầu lưu trữ thông tin tiêu đề gzip trong cấu trúc gz_header được cung cấp. InflateGetHeader() có thể được gọi sau InflateInit2() hoặc InflateReset() và trước lần gọi đầu tiên của Inflate(). Khi inflatable() xử lý luồng gzip, head->done bằng 0 cho đến khi hoàn thành tiêu đề, tại thời điểm đó head->done được đặt thành một. Nếu một luồng zlib đang được giải mã, thì head->done được đặt thành –1 để cho biết rằng sẽ không có thông tin tiêu đề gzip sắp tới. Lưu ý rằng Z_BLOCK có thể được sử dụng để buộc thổi phồng () quay lại ngay sau khi quá trình xử lý tiêu đề hoàn tất và trước khi bất kỳ dữ liệu thực tế nào được giải nén

Các trường văn bản, thời gian, xflags và os được điền bằng nội dung tiêu đề gzip. hcrc được đặt thành true nếu có CRC tiêu đề. (CRC tiêu đề hợp lệ nếu done được đặt thành một. ) Nếu extra không phải là Z_NULL, thì extra_max chứa số byte tối đa để ghi vào extra. Sau khi thực hiện là true, extra_len chứa độ dài trường bổ sung thực tế và extra chứa trường bổ sung hoặc trường đó bị cắt bớt nếu extra_max nhỏ hơn extra_len. Nếu tên không phải là Z_NULL, thì tối đa tên_max ký tự được viết ở đó, kết thúc bằng số 0 trừ khi độ dài lớn hơn tên_max. Nếu nhận xét không phải là Z_NULL, thì tối đa comm_max ký tự được viết ở đó, kết thúc bằng số 0 trừ khi độ dài lớn hơn comm_max. Khi bất kỳ bổ sung, tên hoặc nhận xét nào không phải là Z_NULL và trường tương ứng không có trong tiêu đề, thì trường đó được đặt thành Z_NULL để báo hiệu sự vắng mặt của nó. Điều này cho phép sử dụng deflateSetHeader() với cấu trúc được trả về để sao chép tiêu đề. Tuy nhiên, nếu các trường đó được đặt thành bộ nhớ được cấp phát, thì ứng dụng sẽ cần lưu các con trỏ đó ở nơi khác để cuối cùng chúng có thể được giải phóng

Nếu lạm phátGetHeader không được sử dụng, thì thông tin tiêu đề sẽ bị loại bỏ. Tiêu đề luôn được kiểm tra tính hợp lệ, bao gồm CRC tiêu đề nếu có. InflateReset() sẽ thiết lập lại quy trình loại bỏ thông tin tiêu đề. Ứng dụng sẽ cần gọi lại lạm phátGetHeader() để truy xuất tiêu đề từ luồng gzip tiếp theo

InflateGetHeader trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng nguồn không nhất quán

#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4
#define Z_BLOCK         5
#define Z_TREES         6
9Khởi tạo trạng thái luồng nội bộ để giải nén bằng lệnh gọi inflatableBack(). Các trường zalloc, zfree vàopaque trong strm phải được khởi tạo trước khi gọi. Nếu zalloc và zfree là Z_NULL, thì quy trình cấp phát bộ nhớ bắt nguồn từ thư viện mặc định được sử dụng. windowBits là logarit cơ số hai của kích thước cửa sổ, trong phạm vi 8. 15. cửa sổ là bộ đệm do người gọi cung cấp có kích thước đó. Ngoại trừ các ứng dụng đặc biệt đảm bảo rằng giảm phát đã được sử dụng với kích thước cửa sổ nhỏ, windowBits phải là 15 và cửa sổ 32K byte phải được cung cấp để có thể giải nén các luồng giảm phát chung

Xem inflatableBack() để biết cách sử dụng các thói quen này

blowbackBackInit sẽ trả về Z_OK nếu thành công, Z_STREAM_ERROR nếu bất kỳ tham số nào không hợp lệ, Z_MEM_ERROR nếu không thể phân bổ trạng thái bên trong hoặc Z_VERSION_ERROR nếu phiên bản của thư viện không khớp với phiên bản của tệp tiêu đề

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
0inflateBack() thực hiện tăng thô với một lệnh gọi bằng cách sử dụng giao diện gọi lại cho đầu vào và đầu ra. Điều này có khả năng hiệu quả hơn so với inflatable() đối với các ứng dụng tệp i/o, ở chỗ nó tránh sao chép giữa đầu ra và cửa sổ trượt bằng cách đơn giản biến chính cửa sổ đó thành bộ đệm đầu ra. thổi phồng () có thể nhanh hơn trên các CPU hiện đại khi được sử dụng với bộ đệm lớn. inflatableBack() tin tưởng ứng dụng sẽ không thay đổi bộ đệm đầu ra được truyền bởi hàm đầu ra, ít nhất là cho đến khi inflatableBack() trả về

blowbackBackInit() phải được gọi trước để phân bổ trạng thái bên trong và khởi tạo trạng thái với bộ đệm cửa sổ do người dùng cung cấp. InflateBack() sau đó có thể được sử dụng nhiều lần để thổi phồng luồng giảm phát hoàn chỉnh, thô với mỗi lệnh gọi. InflateBackEnd() sau đó được gọi để giải phóng trạng thái được phân bổ

Luồng giảm phát thô là luồng không có tiêu đề hoặc đoạn giới thiệu zlib hoặc gzip. Quy trình này thường được sử dụng trong một tiện ích đọc các tệp zip hoặc gzip và ghi ra các tệp không nén. Tiện ích sẽ tự giải mã tiêu đề và xử lý đoạn giới thiệu, do đó, quy trình này chỉ mong đợi luồng giảm phát thô được giải nén. Điều này khác với hành vi mặc định của thổi phồng(), đòi hỏi một tiêu đề và đoạn giới thiệu zlib xung quanh luồng giảm phát

InflateBack() sử dụng hai chương trình con được cung cấp bởi người gọi, sau đó được gọi bởi InflatableBack() cho đầu vào và đầu ra. inflatableBack() gọi các thủ tục đó cho đến khi nó đọc một luồng xì hơi hoàn chỉnh và ghi ra tất cả dữ liệu không nén hoặc cho đến khi nó gặp lỗi. Các tham số và kiểu trả về của hàm được xác định ở trên trong typedefs in_func và out_func. InflateBack() sẽ gọi in(in_desc, &buf) sẽ trả về số byte của đầu vào được cung cấp và một con trỏ tới đầu vào đó trong buf. Nếu không có dữ liệu đầu vào nào, thì in() phải trả về số không—buf bị bỏ qua trong trường hợp đó—và inflatableBack() sẽ trả về lỗi bộ đệm. inflatableBack() sẽ gọi out(out_desc, buf, len) để ghi dữ liệu không nén buf[0. len-1]. out() sẽ trả về 0 khi thành công hoặc khác 0 khi thất bại. Nếu out() trả về giá trị khác không, thì inflatableBack() sẽ trả về có lỗi. Cả in() và out() đều không được phép thay đổi nội dung của cửa sổ được cung cấp cho inflatableBackInit(), đây cũng là bộ đệm mà out() sử dụng để ghi từ. Độ dài được viết bởi out() sẽ tối đa bằng kích thước cửa sổ. Bất kỳ lượng đầu vào khác không nào cũng có thể được cung cấp bởi in()

Để thuận tiện, có thể cung cấp đầu vào inflatableBack() trong lần gọi đầu tiên bằng cách đặt strm->next_in và strm->avail_in. Nếu đầu vào đó đã hết, thì in() sẽ được gọi. Do đó, strm->next_in phải được khởi tạo trước khi gọi inflatableBack(). Nếu strm->next_in là Z_NULL thì in() sẽ được gọi ngay cho đầu vào. Nếu strm->next_in không phải là Z_NULL, thì strm->avail_in cũng phải được khởi tạo, và sau đó nếu strm->avail_in khác 0, đầu vào ban đầu sẽ được lấy từ strm->next_in[0. strm->avail_in - 1]

Các tham số in_desc và out_desc của inflatableBack() được chuyển thành tham số đầu tiên của in() và out() tương ứng khi chúng được gọi. Các bộ mô tả này có thể được sử dụng tùy chọn để chuyển bất kỳ thông tin nào mà các hàm in() và out() do người gọi cung cấp cần để thực hiện công việc của chúng.

Khi trả lại, inflatableBack() sẽ đặt strm->next_in và strm->avail_in để trả lại bất kỳ đầu vào không sử dụng nào được cung cấp bởi lệnh gọi in() cuối cùng. Các giá trị trả về của inflatableBack() có thể là Z_STREAM_END nếu thành công, Z_BUF_ERROR nếu in() hoặc out() trả về lỗi, Z_DATA_ERROR nếu có lỗi định dạng trong luồng giảm phát (trong trường hợp đó, strm->msg được đặt để biểu thị . Trong trường hợp Z_BUF_ERROR, có thể phân biệt lỗi đầu vào hoặc đầu ra bằng cách sử dụng strm->next_in, đây sẽ chỉ là Z_NULL nếu in() trả về lỗi. Nếu strm->next_in không phải là Z_NULL, thì Z_BUF_ERROR là do out() trả về giá trị khác không. (in() sẽ luôn được gọi trước out(), vì vậy strm->next_in được đảm bảo được xác định nếu out() trả về giá trị khác 0. ) Lưu ý rằng inflatableBack() không thể trả về Z_OK

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
1Tất cả bộ nhớ được phân bổ bởi inflatableBackInit() được giải phóng

inflatableBackEnd() trả về Z_OK nếu thành công hoặc Z_STREAM_ERROR nếu trạng thái luồng không nhất quán

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
2Return flags cho biết các tùy chọn thời gian biên dịch

Kích cỡ loại, mỗi loại hai bit, 00 = 16 bit, 01 = 32, 10 = 64, 11 = khác

  • 1. 0. kích thước của uInt
  • 3. 2. kích thước của uLong
  • 5. 4. kích thước của voidpf (con trỏ)
  • 7. 6. kích thước của z_off_t
Tùy chọn trình biên dịch, trình biên dịch chương trình và gỡ lỗi
  • 8. ZLIB_DEBUG
  • 9. ASMV hoặc ASMINF — sử dụng mã ASM
  • 10. ZLIB_WINAPI — các hàm đã xuất sử dụng quy ước gọi WINAPI
  • 11. 0 (dành riêng)
Tạo bảng một lần (mã nhỏ hơn, nhưng không an toàn cho luồng nếu đúng)
  • 12. BUILDFIXED — xây dựng các bảng giải mã khối tĩnh khi cần
  • 13. DYNAMIC_CRC_TABLE — xây dựng bảng tính CRC khi cần
  • 14,15. 0 (dành riêng)
Nội dung thư viện (cho biết chức năng còn thiếu)
  • 16. NO_GZCOMPRESS — các hàm gz* không thể nén (để tránh liên kết mã giảm phát khi không cần thiết)
  • 17. NO_GZIP — giảm phát không thể ghi luồng gzip và tăng không thể phát hiện và giải mã luồng gzip (để tránh liên kết mã crc)
  • 18-19. 0 (dành riêng)
Các biến thể hoạt động (thay đổi chức năng thư viện)
  • 20. PKZIP_BUG_WORKAROUND — lạm phát dễ dãi hơn một chút
  • 21. NHANH NHẤT — thuật toán giảm tốc chỉ với một mức nén thấp nhất
  • 22,23. 0 (dành riêng)
Biến thể sprintf được gzprintf sử dụng (không là tốt nhất)
  • 24. 0 = vs*, 1 = s* — 1 có nghĩa là giới hạn ở 20 đối số sau định dạng
  • 25. 0 = *nprintf, 1 = *printf — 1 nghĩa là gzprintf() không an toàn
  • 26. 0 = trả về giá trị, 1 = void — 1 có nghĩa là độ dài chuỗi được suy luận được trả về
phần còn lại

Các chức năng tiện ích

Các chức năng tiện ích sau đây được triển khai trên các chức năng định hướng luồng cơ bản. Để đơn giản hóa giao diện, một số tùy chọn mặc định được giả định (mức nén và mức sử dụng bộ nhớ, chức năng cấp phát bộ nhớ tiêu chuẩn). Mã nguồn của các chức năng tiện ích này có thể dễ dàng sửa đổi nếu bạn cần các tùy chọn đặc biệt.
#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
3Nén bộ đệm nguồn vào bộ đệm đích. sourceLen là độ dài byte của bộ đệm nguồn. Khi nhập, destLen là tổng kích thước của bộ đệm đích, ít nhất phải bằng giá trị được trả về bởi nénBound(sourceLen). Khi thoát, destLen là kích thước thực của dữ liệu nén. nén() tương đương với nén2() với tham số mức là Z_DEFAULT_COMPRESSION

nén trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_BUF_ERROR nếu không đủ chỗ trong bộ đệm đầu ra

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
4Nén bộ đệm nguồn vào bộ đệm đích. Tham số level có ý nghĩa tương tự như trong deflateInit. sourceLen là độ dài byte của bộ đệm nguồn. Khi nhập, destLen là tổng kích thước của bộ đệm đích, ít nhất phải bằng giá trị được trả về bởi nénBound(sourceLen). Khi thoát, destLen là kích thước thực của dữ liệu nén

nén2 trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_BUF_ERROR nếu không đủ chỗ trong bộ đệm đầu ra, Z_STREAM_ERROR nếu tham số cấp độ không hợp lệ

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
5compressBound() trả về giới hạn trên của kích thước nén sau khi nén() hoặc nén2() trên các byte nguồnLen. Nó sẽ được sử dụng trước một lệnh gọi nén() hoặc nén2() để phân bổ bộ đệm đích.
#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
6Giải nén bộ đệm nguồn vào bộ đệm đích. sourceLen là độ dài byte của bộ đệm nguồn. Khi vào, destLen là tổng kích thước của bộ đệm đích, bộ đệm này phải đủ lớn để chứa toàn bộ dữ liệu không nén. (Kích thước của dữ liệu không nén phải được máy nén lưu trước đó và được truyền đến bộ giải nén bằng một số cơ chế bên ngoài phạm vi của thư viện nén này. ) Khi thoát, destLen là kích thước thực của dữ liệu không nén

giải nén trả về Z_OK nếu thành công, Z_MEM_ERROR nếu không đủ bộ nhớ, Z_BUF_ERROR nếu không đủ chỗ trong bộ đệm đầu ra hoặc Z_DATA_ERROR nếu dữ liệu đầu vào bị hỏng hoặc không đầy đủ. Trong trường hợp không đủ chỗ, uncompress() sẽ lấp đầy bộ đệm đầu ra với dữ liệu không nén cho đến thời điểm đó

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
7Giống như giải nén, ngoại trừ sourceLen là một con trỏ, trong đó độ dài của nguồn là *sourceLen. Đổi lại, *sourceLen là số byte nguồn được tiêu thụ

Chức năng truy cập tệp gzip

Thư viện này hỗ trợ đọc và ghi tệp trong gzip (. gz) với giao diện tương tự như của stdio, sử dụng các chức năng bắt đầu bằng "gz". Định dạng gzip khác với định dạng zlib. gzip là trình bao bọc gzip, được ghi lại trong RFC 1952, bao quanh một luồng giảm phát.
#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
8Mở gzip (. gz) tại đường dẫn để đọc và giải nén hoặc nén và ghi. Tham số chế độ giống như trong fopen ("rb" hoặc "wb") nhưng cũng có thể bao gồm mức độ nén ("wb9") hoặc chiến lược. 'f' cho dữ liệu được lọc như trong "wb6f", 'h' cho nén chỉ dành cho Huffman như trong "wb1h", 'R' cho mã hóa độ dài chạy như trong "wb1R" hoặc 'F' cho nén mã cố định như trong . (Xem mô tả về deflateInit2 để biết thêm thông tin về tham số chiến lược. ) 'T' sẽ yêu cầu viết hoặc nối thêm trong suốt mà không nén và không sử dụng định dạng gzip

'a' có thể được sử dụng thay cho 'w' để yêu cầu thêm luồng gzip sẽ được ghi vào tệp. '+' sẽ dẫn đến lỗi vì không hỗ trợ đọc và ghi vào cùng một tệp gzip. Việc thêm 'x' khi ghi sẽ tạo riêng tệp, không thành công nếu tệp đã tồn tại. Trên các hệ thống hỗ trợ nó, việc thêm 'e' khi đọc hoặc ghi sẽ đặt cờ để đóng tệp trong lệnh gọi execve()

Các chức năng này, cũng như gzip, sẽ đọc và giải mã một chuỗi các luồng gzip trong một tệp. Chức năng nối thêm của gzopen() có thể được sử dụng để tạo một tệp như vậy. (Cũng xem gzflush() để biết cách khác để thực hiện việc này. ) Khi nối thêm, gzopen không kiểm tra xem tệp có bắt đầu bằng luồng gzip hay không, cũng như không tìm phần cuối của luồng gzip để bắt đầu nối thêm. gzopen sẽ chỉ nối thêm luồng gzip vào tệp hiện có

gzopen có thể được sử dụng để đọc tệp không ở định dạng gzip; . Khi đọc, điều này sẽ được phát hiện tự động bằng cách tìm tiêu đề gzip hai byte kỳ diệu

gzopen trả về NULL nếu tệp không thể mở được, nếu không đủ bộ nhớ để phân bổ trạng thái gzFile hoặc nếu chế độ không hợp lệ được chỉ định (không cung cấp 'r', 'w' hoặc 'a' hoặc '+ . errno có thể được kiểm tra để xác định xem lý do gzopen không thành công là do không thể mở tệp

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)
9Liên kết gzFile với bộ mô tả tệp fd. Các bộ mô tả tệp được lấy từ các lệnh gọi như open, dup, creat, pipe hoặc fileno (nếu tệp đã được mở trước đó bằng fopen). Tham số chế độ như trong gzopen

Lệnh gọi tiếp theo của gzclose trên gzFile được trả về cũng sẽ đóng bộ mô tả tệp fd, giống như fclose(fdopen(fd), mode) đóng bộ mô tả tệp fd. Nếu bạn muốn giữ fd mở, hãy sử dụng fd = dup(fd_keep); . Bộ mô tả trùng lặp nên được lưu để tránh rò rỉ, vì gzdopen không đóng fd nếu nó bị lỗi. Nếu bạn đang sử dụng fileno() để lấy bộ mô tả tệp từ TẬP TIN *, thì bạn sẽ phải sử dụng dup() để tránh đóng hai lần() bộ mô tả tệp. Cả gzclose() và fclose() sẽ đóng bộ mô tả tệp được liên kết, vì vậy chúng cần có các bộ mô tả tệp khác nhau

gzdopen trả về NULL nếu không đủ bộ nhớ để phân bổ trạng thái gzFile, nếu chế độ không hợp lệ được chỉ định (không cung cấp 'r', 'w' hoặc 'a' hoặc '+') hoặc nếu fd là . Bộ mô tả tệp không được sử dụng cho đến khi gz* tiếp theo đọc, viết, tìm kiếm hoặc đóng hoạt động, vì vậy gzdopen sẽ không phát hiện nếu fd không hợp lệ (trừ khi fd là –1)

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
0Đặt kích thước bộ đệm trong được sử dụng bởi các chức năng của thư viện này cho kích thước tệp. Kích thước bộ đệm mặc định là 8192 byte. Hàm này phải được gọi sau gzopen() hoặc gzdopen() và trước bất kỳ lệnh gọi nào khác đọc hoặc ghi tệp. Cấp phát bộ nhớ đệm luôn được hoãn lại cho lần đọc hoặc ghi đầu tiên. Ba lần kích thước đó trong không gian bộ đệm được phân bổ. Kích thước bộ đệm lớn hơn, chẳng hạn như 64K hoặc 128K byte sẽ làm tăng đáng kể tốc độ giải nén (đọc)

Kích thước bộ đệm mới cũng ảnh hưởng đến độ dài tối đa cho gzprintf()

gzbuffer() trả về 0 nếu thành công, hoặc –1 nếu thất bại, chẳng hạn như bị gọi quá muộn

________ 61 Tự động cập nhật mức nén và chiến lược cho tệp. Xem mô tả của deflateInit2 để biết ý nghĩa của các tham số này. Dữ liệu được cung cấp trước đó sẽ bị xóa trước khi áp dụng các thay đổi tham số

gzsetparams trả về Z_OK nếu thành công, Z_STREAM_ERROR nếu tệp không được mở để ghi, Z_ERRNO nếu có lỗi khi ghi dữ liệu bị xóa hoặc Z_MEM_ERROR nếu có lỗi cấp phát bộ nhớ

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
2Đọc và giải nén tối đa len byte không nén từ tệp vào buf. Nếu tệp đầu vào không ở định dạng gzip, gzread sẽ sao chép số byte đã cho vào bộ đệm trực tiếp từ tệp

Sau khi kết thúc luồng gzip trong đầu vào, gzread sẽ tiếp tục đọc, tìm kiếm luồng gzip khác. Bất kỳ số lượng luồng gzip nào cũng có thể được nối trong tệp đầu vào và tất cả sẽ được giải nén bởi gzread(). Nếu gặp phải thứ gì đó không phải là luồng gzip sau luồng gzip, rác ở cuối phần còn lại đó sẽ bị bỏ qua (và không có lỗi nào được trả về)

gzread có thể được sử dụng để đọc tệp gzip đang được ghi đồng thời. Khi đến cuối đầu vào, gzread sẽ trả về với dữ liệu có sẵn. Nếu mã lỗi do gzerror trả về là Z_OK hoặc Z_BUF_ERROR, thì có thể sử dụng gzclearerr để xóa chỉ báo kết thúc tệp để cho phép thử lại gzread. Z_OK chỉ ra rằng một luồng gzip đã được hoàn thành trên gzread cuối cùng. Z_BUF_ERROR chỉ ra rằng tệp đầu vào đã kết thúc ở giữa luồng gzip. Lưu ý rằng gzread không trả về –1 trong trường hợp luồng gzip không đầy đủ. Lỗi này được hoãn lại cho đến khi gzclose(), lỗi này sẽ trả về Z_BUF_ERROR nếu gzread cuối cùng kết thúc ở giữa luồng gzip. Ngoài ra, có thể sử dụng gzerror trước gzclose để phát hiện trường hợp này

gzread trả về số byte không nén thực sự đã đọc, ít hơn len cho phần cuối của tệp hoặc –1 cho lỗi. Nếu len quá lớn để vừa với int, thì không có gì được đọc, –1 được trả về và trạng thái lỗi được đặt thành Z_STREAM_ERROR

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
3Đọc và giải nén tối đa các mục có kích thước kích thước từ tệp thành buf, nếu không thì hoạt động như gzread(). Điều này sao chép giao diện của fread() của stdio, với các loại yêu cầu và trả về size_t. Nếu thư viện xác định size_t, thì z_size_t giống với size_t. Nếu không thì z_size_t là kiểu số nguyên không dấu có thể chứa con trỏ

gzfread() trả về số mục đầy đủ được đọc theo kích thước, hoặc trả về 0 nếu đã đến cuối tệp và không thể đọc toàn bộ mục hoặc nếu có lỗi. gzerror() phải được tham khảo nếu số 0 được trả về để xác định xem có lỗi hay không. Nếu phép nhân của kích thước và số lượng tràn ra, tôi. e. sản phẩm không vừa với z_size_t, sau đó không có gì được đọc, số 0 được trả về và trạng thái lỗi được đặt thành Z_STREAM_ERROR

Trong trường hợp đến cuối tệp và chỉ có một phần mục ở cuối, tôi. e. chiều dài dữ liệu không nén còn lại không phải là bội số của kích thước, sau đó mục một phần cuối cùng vẫn được đọc vào buf và cờ cuối tệp được đặt. Độ dài của một phần mục đã đọc không được cung cấp, nhưng có thể được suy ra từ kết quả của gztell(). Hành vi này giống như hành vi triển khai fread() trong các thư viện phổ biến, nhưng nó ngăn việc sử dụng trực tiếp gzfread() để đọc tệp được ghi đồng thời, đặt lại và thử lại ở cuối tệp, khi kích thước không bằng 1

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
4Nén và ghi len byte không nén tại buf vào tệp. gzwrite trả về số byte không nén được ghi hoặc 0 trong trường hợp có lỗi.
#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
5Nén và ghi các mục nitems có kích thước từ buf sang tệp, sao chép giao diện của fwrite() của stdio, với yêu cầu size_t và các loại trả về. Nếu thư viện xác định size_t, thì z_size_t giống với size_t. Nếu không thì z_size_t là kiểu số nguyên không dấu có thể chứa con trỏ

gzfwrite() trả về số mục đầy đủ được ghi theo kích thước hoặc bằng 0 nếu có lỗi. Nếu phép nhân của kích thước và số lượng tràn ra, tôi. e. sản phẩm không vừa với z_size_t, sau đó không có gì được ghi, số 0 được trả về và trạng thái lỗi được đặt thành Z_STREAM_ERROR

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
6Chuyển đổi, định dạng, nén và viết đối số (. ) thành tệp dưới sự kiểm soát của định dạng chuỗi, như trong fprintf. gzprintf trả về số byte không nén thực sự được ghi hoặc mã lỗi zlib âm trong trường hợp có lỗi. Số lượng byte không nén đã ghi được giới hạn ở 8191 hoặc nhỏ hơn một byte so với kích thước bộ đệm được cung cấp cho gzbuffer(). Người gọi phải đảm bảo rằng giới hạn này không bị vượt quá. Nếu vượt quá, thì gzprintf() sẽ trả về lỗi (0) mà không có gì được ghi. Trong trường hợp này, cũng có thể xảy ra lỗi tràn bộ đệm với những hậu quả không thể đoán trước, điều này chỉ có thể xảy ra nếu zlib được biên dịch bằng các hàm không an toàn sprintf() hoặc vsprintf(), vì các hàm snprintf() hoặc vsnprintf() an toàn không khả dụng. Điều này có thể được xác định bằng cách sử dụng zlibCompileFlags().
#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
7Nén và ghi chuỗi s kết thúc null đã cho vào tệp, ngoại trừ ký tự null kết thúc

gzputs trả về số ký tự đã viết, hoặc –1 trong trường hợp có lỗi

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
8Đọc và giải nén các byte từ tệp vào buf, cho đến khi các ký tự len-1 được đọc hoặc cho đến khi một ký tự dòng mới được đọc và chuyển sang buf hoặc gặp phải tình trạng kết thúc tệp. Nếu bất kỳ ký tự nào được đọc hoặc nếu len là một ký tự, chuỗi sẽ được kết thúc bằng ký tự null. Nếu không có ký tự nào được đọc do phần cuối của tệp hoặc len nhỏ hơn một, thì bộ đệm sẽ không bị ảnh hưởng

gzgets trả về buf là một chuỗi kết thúc null hoặc nó trả về NULL cho phần cuối của tệp hoặc trong trường hợp có lỗi. Nếu có lỗi, nội dung tại buf là không xác định

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
9Nén và viết c, được chuyển thành ký tự không dấu, vào tệp. gzputc trả về giá trị đã được ghi hoặc –1 trong trường hợp có lỗi.
#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
0Đọc và giải nén một byte từ tệp. gzgetc trả về byte này hoặc –1 trong trường hợp hết tệp hoặc lỗi. Điều này được thực hiện như một macro cho tốc độ. Như vậy, nó không thực hiện tất cả các kiểm tra mà các chức năng khác thực hiện. Tôi. e. nó không kiểm tra xem tệp có phải là NULL hay không, cũng như liệu tệp cấu trúc trỏ đến có bị ghi đè hay không.
#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
1Đẩy c trở lại luồng để tệp được đọc dưới dạng ký tự đầu tiên trong lần đọc tiếp theo. Luôn cho phép ít nhất một ký tự đẩy lùi. gzungetc() trả về ký tự được đẩy, hoặc –1 nếu không thành công. gzungetc() sẽ thất bại nếu c là –1, và có thể thất bại nếu một ký tự đã được đẩy nhưng chưa được đọc. Nếu gzungetc được sử dụng ngay sau gzopen hoặc gzdopen, ít nhất kích thước bộ đệm đầu ra của các ký tự được đẩy được cho phép. (Xem gzbuffer ở trên. ) Ký tự được đẩy sẽ bị loại bỏ nếu luồng được định vị lại bằng gzseek() hoặc gzrewind().
#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
2Xóa tất cả đầu ra đang chờ xử lý vào tệp. Tham số flush giống như trong hàm deflate(). Giá trị trả về là số lỗi zlib (xem hàm gzerror bên dưới). gzflush chỉ được phép khi viết

Nếu tham số tuôn ra là Z_FINISH, dữ liệu còn lại được ghi và luồng gzip được hoàn thành ở đầu ra. Nếu gzwrite() được gọi lại, một luồng gzip mới sẽ được bắt đầu ở đầu ra. gzread() có thể đọc các luồng gzip được nối như vậy

gzflush chỉ nên được gọi khi thực sự cần thiết vì nó sẽ làm giảm khả năng nén nếu được gọi quá thường xuyên

#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
3Đặt vị trí bắt đầu thành offset so với vị trí bắt đầu cho gzread hoặc gzwrite tiếp theo trên tệp. Phần bù đại diện cho một số byte trong luồng dữ liệu không nén. Tham số wherece được định nghĩa như trong lseek(2);

Nếu tệp được mở để đọc, chức năng này được mô phỏng nhưng có thể cực kỳ chậm. Nếu tệp được mở để ghi, chỉ hỗ trợ tìm kiếm chuyển tiếp;

gzseek trả về vị trí offset kết quả được đo bằng byte từ đầu luồng không nén hoặc –1 trong trường hợp có lỗi, đặc biệt nếu tệp được mở để ghi và vị trí bắt đầu mới sẽ ở trước vị trí hiện tại

#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
4Tua lại tập tin. Chức năng này chỉ được hỗ trợ để đọc

gzrewind(file) tương đương với (int)gzseek(file, 0L, SEEK_SET)

#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
5Trả lại vị trí bắt đầu cho gzread hoặc gzwrite tiếp theo trên tệp. Vị trí này đại diện cho một số byte trong luồng dữ liệu không nén và bằng 0 khi bắt đầu, ngay cả khi nối thêm hoặc đọc luồng gzip từ giữa tệp bằng gzdopen()

gztell(file) tương đương với gzseek(file, 0L, SEEK_CUR)

#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
6Trả về độ lệch đọc hoặc ghi được nén (thực tế) hiện tại của tệp. Phần bù này bao gồm số byte đứng trước luồng gzip, chẳng hạn như khi nối thêm hoặc khi sử dụng gzdopen() để đọc. Khi đọc, phần bù không bao gồm đầu vào được đệm chưa sử dụng. Thông tin này có thể được sử dụng cho một chỉ báo tiến độ. Khi có lỗi, gzoffset() trả về –1.
#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
7Trả về true (1) nếu chỉ báo kết thúc tệp cho tệp đã được đặt trong khi đọc, false (0) nếu không. Lưu ý rằng chỉ báo kết thúc tệp chỉ được đặt nếu quá trình đọc đã cố vượt qua phần cuối của đầu vào, nhưng lại xuất hiện trong thời gian ngắn. Do đó, giống như feof(), gzeof() có thể trả về false ngay cả khi không còn dữ liệu để đọc, trong trường hợp yêu cầu đọc cuối cùng là số byte chính xác còn lại trong tệp đầu vào. Điều này sẽ xảy ra nếu kích thước tệp đầu vào là bội số chính xác của kích thước bộ đệm

Nếu gzeof() trả về true, thì các hàm đọc sẽ không trả về dữ liệu nào nữa, trừ khi gzclearerr() chỉ báo kết thúc tệp được đặt lại và tệp đầu vào đã phát triển kể từ khi phát hiện thấy phần cuối tệp trước đó

#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
8Trả về true (1) nếu tệp đang được sao chép trực tiếp trong khi đọc hoặc false (0) nếu tệp là luồng gzip đang được giải nén

Nếu tệp đầu vào trống, gzdirect() sẽ trả về true, vì đầu vào không chứa luồng gzip

Nếu gzdirect() được sử dụng ngay sau gzopen() hoặc gzdopen(), nó sẽ khiến bộ đệm được phân bổ để cho phép đọc tệp để xác định xem đó có phải là tệp gzip hay không. Do đó, nếu gzbuffer() được sử dụng, nó sẽ được gọi trước gzdirect()

Khi viết, gzdirect() trả về true (1) nếu yêu cầu ghi trong suốt ("wT" cho chế độ gzopen()) hoặc false (0) nếu không. (Ghi chú. gzdirect() không cần thiết khi viết. Viết minh bạch phải được yêu cầu rõ ràng, vì vậy ứng dụng đã biết câu trả lời. Khi liên kết tĩnh, sử dụng gzdirect() sẽ bao gồm tất cả mã zlib để đọc và giải nén tệp gzip, điều này có thể không được mong muốn. )

#define Z_FILTERED            1
#define Z_HUFFMAN_ONLY        2
#define Z_RLE                 3
#define Z_FIXED               4
#define Z_DEFAULT_STRATEGY    0
9Xóa tất cả đầu ra đang chờ xử lý cho tệp, nếu cần, hãy đóng tệp và hủy phân bổ trạng thái (khử) nén. Lưu ý rằng khi tệp đã đóng, bạn không thể gọi gzerror bằng tệp vì cấu trúc của tệp đã bị hủy cấp phát. gzclose không được gọi nhiều lần trên cùng một tệp, giống như free không được gọi nhiều lần trên cùng một phân bổ

gzclose sẽ trả về Z_STREAM_ERROR nếu tệp không hợp lệ, Z_ERRNO khi có lỗi thao tác tệp, Z_MEM_ERROR nếu hết bộ nhớ, Z_BUF_ERROR nếu lần đọc cuối cùng kết thúc ở giữa luồng gzip hoặc Z_OK nếu thành công

#define Z_BINARY   0
#define Z_TEXT     1
#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */
#define Z_UNKNOWN  2
0Giống như gzclose(), nhưng gzclose_r() chỉ dùng khi đọc và gzclose_w() chỉ dùng khi viết hoặc nối thêm. Ưu điểm của việc sử dụng những thứ này thay vì gzclose() là chúng tránh liên kết trong mã nén hoặc giải nén zlib không được sử dụng khi chỉ đọc hoặc chỉ viết tương ứng. Nếu sử dụng gzclose() thì cả mã nén và giải nén sẽ được đưa vào ứng dụng khi liên kết với thư viện zlib tĩnh.
#define Z_BINARY   0
#define Z_TEXT     1
#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */
#define Z_UNKNOWN  2
1Trả lại thông báo lỗi cho lỗi cuối cùng xảy ra trên tệp. errnum được đặt thành số lỗi zlib. Nếu xảy ra lỗi trong hệ thống tệp chứ không phải trong thư viện nén, errnum được đặt thành Z_ERRNO và ứng dụng có thể tham khảo errno để lấy mã lỗi chính xác

Ứng dụng không được sửa đổi chuỗi trả về. Các lệnh gọi hàm này trong tương lai có thể làm mất hiệu lực chuỗi đã trả về trước đó. Nếu tệp bị đóng thì chuỗi được gzerror trả về trước đó sẽ không còn nữa

gzerror() nên được sử dụng để phân biệt các lỗi từ phần cuối của tệp đối với các hàm ở trên không phân biệt các trường hợp đó trong các giá trị trả về của chúng