Chris@4
|
1
|
Chris@4
|
2
|
Chris@4
|
3
|
Chris@4
|
4
|
Chris@4
|
5
|
Chris@4
|
6
|
Chris@4
|
7 Network Working Group P. Deutsch
|
Chris@4
|
8 Request for Comments: 1950 Aladdin Enterprises
|
Chris@4
|
9 Category: Informational J-L. Gailly
|
Chris@4
|
10 Info-ZIP
|
Chris@4
|
11 May 1996
|
Chris@4
|
12
|
Chris@4
|
13
|
Chris@4
|
14 ZLIB Compressed Data Format Specification version 3.3
|
Chris@4
|
15
|
Chris@4
|
16 Status of This Memo
|
Chris@4
|
17
|
Chris@4
|
18 This memo provides information for the Internet community. This memo
|
Chris@4
|
19 does not specify an Internet standard of any kind. Distribution of
|
Chris@4
|
20 this memo is unlimited.
|
Chris@4
|
21
|
Chris@4
|
22 IESG Note:
|
Chris@4
|
23
|
Chris@4
|
24 The IESG takes no position on the validity of any Intellectual
|
Chris@4
|
25 Property Rights statements contained in this document.
|
Chris@4
|
26
|
Chris@4
|
27 Notices
|
Chris@4
|
28
|
Chris@4
|
29 Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly
|
Chris@4
|
30
|
Chris@4
|
31 Permission is granted to copy and distribute this document for any
|
Chris@4
|
32 purpose and without charge, including translations into other
|
Chris@4
|
33 languages and incorporation into compilations, provided that the
|
Chris@4
|
34 copyright notice and this notice are preserved, and that any
|
Chris@4
|
35 substantive changes or deletions from the original are clearly
|
Chris@4
|
36 marked.
|
Chris@4
|
37
|
Chris@4
|
38 A pointer to the latest version of this and related documentation in
|
Chris@4
|
39 HTML format can be found at the URL
|
Chris@4
|
40 <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>.
|
Chris@4
|
41
|
Chris@4
|
42 Abstract
|
Chris@4
|
43
|
Chris@4
|
44 This specification defines a lossless compressed data format. The
|
Chris@4
|
45 data can be produced or consumed, even for an arbitrarily long
|
Chris@4
|
46 sequentially presented input data stream, using only an a priori
|
Chris@4
|
47 bounded amount of intermediate storage. The format presently uses
|
Chris@4
|
48 the DEFLATE compression method but can be easily extended to use
|
Chris@4
|
49 other compression methods. It can be implemented readily in a manner
|
Chris@4
|
50 not covered by patents. This specification also defines the ADLER-32
|
Chris@4
|
51 checksum (an extension and improvement of the Fletcher checksum),
|
Chris@4
|
52 used for detection of data corruption, and provides an algorithm for
|
Chris@4
|
53 computing it.
|
Chris@4
|
54
|
Chris@4
|
55
|
Chris@4
|
56
|
Chris@4
|
57
|
Chris@4
|
58 Deutsch & Gailly Informational [Page 1]
|
Chris@4
|
59
|
Chris@4
|
60 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
61
|
Chris@4
|
62
|
Chris@4
|
63 Table of Contents
|
Chris@4
|
64
|
Chris@4
|
65 1. Introduction ................................................... 2
|
Chris@4
|
66 1.1. Purpose ................................................... 2
|
Chris@4
|
67 1.2. Intended audience ......................................... 3
|
Chris@4
|
68 1.3. Scope ..................................................... 3
|
Chris@4
|
69 1.4. Compliance ................................................ 3
|
Chris@4
|
70 1.5. Definitions of terms and conventions used ................ 3
|
Chris@4
|
71 1.6. Changes from previous versions ............................ 3
|
Chris@4
|
72 2. Detailed specification ......................................... 3
|
Chris@4
|
73 2.1. Overall conventions ....................................... 3
|
Chris@4
|
74 2.2. Data format ............................................... 4
|
Chris@4
|
75 2.3. Compliance ................................................ 7
|
Chris@4
|
76 3. References ..................................................... 7
|
Chris@4
|
77 4. Source code .................................................... 8
|
Chris@4
|
78 5. Security Considerations ........................................ 8
|
Chris@4
|
79 6. Acknowledgements ............................................... 8
|
Chris@4
|
80 7. Authors' Addresses ............................................. 8
|
Chris@4
|
81 8. Appendix: Rationale ............................................ 9
|
Chris@4
|
82 9. Appendix: Sample code ..........................................10
|
Chris@4
|
83
|
Chris@4
|
84 1. Introduction
|
Chris@4
|
85
|
Chris@4
|
86 1.1. Purpose
|
Chris@4
|
87
|
Chris@4
|
88 The purpose of this specification is to define a lossless
|
Chris@4
|
89 compressed data format that:
|
Chris@4
|
90
|
Chris@4
|
91 * Is independent of CPU type, operating system, file system,
|
Chris@4
|
92 and character set, and hence can be used for interchange;
|
Chris@4
|
93
|
Chris@4
|
94 * Can be produced or consumed, even for an arbitrarily long
|
Chris@4
|
95 sequentially presented input data stream, using only an a
|
Chris@4
|
96 priori bounded amount of intermediate storage, and hence can
|
Chris@4
|
97 be used in data communications or similar structures such as
|
Chris@4
|
98 Unix filters;
|
Chris@4
|
99
|
Chris@4
|
100 * Can use a number of different compression methods;
|
Chris@4
|
101
|
Chris@4
|
102 * Can be implemented readily in a manner not covered by
|
Chris@4
|
103 patents, and hence can be practiced freely.
|
Chris@4
|
104
|
Chris@4
|
105 The data format defined by this specification does not attempt to
|
Chris@4
|
106 allow random access to compressed data.
|
Chris@4
|
107
|
Chris@4
|
108
|
Chris@4
|
109
|
Chris@4
|
110
|
Chris@4
|
111
|
Chris@4
|
112
|
Chris@4
|
113
|
Chris@4
|
114 Deutsch & Gailly Informational [Page 2]
|
Chris@4
|
115
|
Chris@4
|
116 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
117
|
Chris@4
|
118
|
Chris@4
|
119 1.2. Intended audience
|
Chris@4
|
120
|
Chris@4
|
121 This specification is intended for use by implementors of software
|
Chris@4
|
122 to compress data into zlib format and/or decompress data from zlib
|
Chris@4
|
123 format.
|
Chris@4
|
124
|
Chris@4
|
125 The text of the specification assumes a basic background in
|
Chris@4
|
126 programming at the level of bits and other primitive data
|
Chris@4
|
127 representations.
|
Chris@4
|
128
|
Chris@4
|
129 1.3. Scope
|
Chris@4
|
130
|
Chris@4
|
131 The specification specifies a compressed data format that can be
|
Chris@4
|
132 used for in-memory compression of a sequence of arbitrary bytes.
|
Chris@4
|
133
|
Chris@4
|
134 1.4. Compliance
|
Chris@4
|
135
|
Chris@4
|
136 Unless otherwise indicated below, a compliant decompressor must be
|
Chris@4
|
137 able to accept and decompress any data set that conforms to all
|
Chris@4
|
138 the specifications presented here; a compliant compressor must
|
Chris@4
|
139 produce data sets that conform to all the specifications presented
|
Chris@4
|
140 here.
|
Chris@4
|
141
|
Chris@4
|
142 1.5. Definitions of terms and conventions used
|
Chris@4
|
143
|
Chris@4
|
144 byte: 8 bits stored or transmitted as a unit (same as an octet).
|
Chris@4
|
145 (For this specification, a byte is exactly 8 bits, even on
|
Chris@4
|
146 machines which store a character on a number of bits different
|
Chris@4
|
147 from 8.) See below, for the numbering of bits within a byte.
|
Chris@4
|
148
|
Chris@4
|
149 1.6. Changes from previous versions
|
Chris@4
|
150
|
Chris@4
|
151 Version 3.1 was the first public release of this specification.
|
Chris@4
|
152 In version 3.2, some terminology was changed and the Adler-32
|
Chris@4
|
153 sample code was rewritten for clarity. In version 3.3, the
|
Chris@4
|
154 support for a preset dictionary was introduced, and the
|
Chris@4
|
155 specification was converted to RFC style.
|
Chris@4
|
156
|
Chris@4
|
157 2. Detailed specification
|
Chris@4
|
158
|
Chris@4
|
159 2.1. Overall conventions
|
Chris@4
|
160
|
Chris@4
|
161 In the diagrams below, a box like this:
|
Chris@4
|
162
|
Chris@4
|
163 +---+
|
Chris@4
|
164 | | <-- the vertical bars might be missing
|
Chris@4
|
165 +---+
|
Chris@4
|
166
|
Chris@4
|
167
|
Chris@4
|
168
|
Chris@4
|
169
|
Chris@4
|
170 Deutsch & Gailly Informational [Page 3]
|
Chris@4
|
171
|
Chris@4
|
172 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
173
|
Chris@4
|
174
|
Chris@4
|
175 represents one byte; a box like this:
|
Chris@4
|
176
|
Chris@4
|
177 +==============+
|
Chris@4
|
178 | |
|
Chris@4
|
179 +==============+
|
Chris@4
|
180
|
Chris@4
|
181 represents a variable number of bytes.
|
Chris@4
|
182
|
Chris@4
|
183 Bytes stored within a computer do not have a "bit order", since
|
Chris@4
|
184 they are always treated as a unit. However, a byte considered as
|
Chris@4
|
185 an integer between 0 and 255 does have a most- and least-
|
Chris@4
|
186 significant bit, and since we write numbers with the most-
|
Chris@4
|
187 significant digit on the left, we also write bytes with the most-
|
Chris@4
|
188 significant bit on the left. In the diagrams below, we number the
|
Chris@4
|
189 bits of a byte so that bit 0 is the least-significant bit, i.e.,
|
Chris@4
|
190 the bits are numbered:
|
Chris@4
|
191
|
Chris@4
|
192 +--------+
|
Chris@4
|
193 |76543210|
|
Chris@4
|
194 +--------+
|
Chris@4
|
195
|
Chris@4
|
196 Within a computer, a number may occupy multiple bytes. All
|
Chris@4
|
197 multi-byte numbers in the format described here are stored with
|
Chris@4
|
198 the MOST-significant byte first (at the lower memory address).
|
Chris@4
|
199 For example, the decimal number 520 is stored as:
|
Chris@4
|
200
|
Chris@4
|
201 0 1
|
Chris@4
|
202 +--------+--------+
|
Chris@4
|
203 |00000010|00001000|
|
Chris@4
|
204 +--------+--------+
|
Chris@4
|
205 ^ ^
|
Chris@4
|
206 | |
|
Chris@4
|
207 | + less significant byte = 8
|
Chris@4
|
208 + more significant byte = 2 x 256
|
Chris@4
|
209
|
Chris@4
|
210 2.2. Data format
|
Chris@4
|
211
|
Chris@4
|
212 A zlib stream has the following structure:
|
Chris@4
|
213
|
Chris@4
|
214 0 1
|
Chris@4
|
215 +---+---+
|
Chris@4
|
216 |CMF|FLG| (more-->)
|
Chris@4
|
217 +---+---+
|
Chris@4
|
218
|
Chris@4
|
219
|
Chris@4
|
220
|
Chris@4
|
221
|
Chris@4
|
222
|
Chris@4
|
223
|
Chris@4
|
224
|
Chris@4
|
225
|
Chris@4
|
226 Deutsch & Gailly Informational [Page 4]
|
Chris@4
|
227
|
Chris@4
|
228 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
229
|
Chris@4
|
230
|
Chris@4
|
231 (if FLG.FDICT set)
|
Chris@4
|
232
|
Chris@4
|
233 0 1 2 3
|
Chris@4
|
234 +---+---+---+---+
|
Chris@4
|
235 | DICTID | (more-->)
|
Chris@4
|
236 +---+---+---+---+
|
Chris@4
|
237
|
Chris@4
|
238 +=====================+---+---+---+---+
|
Chris@4
|
239 |...compressed data...| ADLER32 |
|
Chris@4
|
240 +=====================+---+---+---+---+
|
Chris@4
|
241
|
Chris@4
|
242 Any data which may appear after ADLER32 are not part of the zlib
|
Chris@4
|
243 stream.
|
Chris@4
|
244
|
Chris@4
|
245 CMF (Compression Method and flags)
|
Chris@4
|
246 This byte is divided into a 4-bit compression method and a 4-
|
Chris@4
|
247 bit information field depending on the compression method.
|
Chris@4
|
248
|
Chris@4
|
249 bits 0 to 3 CM Compression method
|
Chris@4
|
250 bits 4 to 7 CINFO Compression info
|
Chris@4
|
251
|
Chris@4
|
252 CM (Compression method)
|
Chris@4
|
253 This identifies the compression method used in the file. CM = 8
|
Chris@4
|
254 denotes the "deflate" compression method with a window size up
|
Chris@4
|
255 to 32K. This is the method used by gzip and PNG (see
|
Chris@4
|
256 references [1] and [2] in Chapter 3, below, for the reference
|
Chris@4
|
257 documents). CM = 15 is reserved. It might be used in a future
|
Chris@4
|
258 version of this specification to indicate the presence of an
|
Chris@4
|
259 extra field before the compressed data.
|
Chris@4
|
260
|
Chris@4
|
261 CINFO (Compression info)
|
Chris@4
|
262 For CM = 8, CINFO is the base-2 logarithm of the LZ77 window
|
Chris@4
|
263 size, minus eight (CINFO=7 indicates a 32K window size). Values
|
Chris@4
|
264 of CINFO above 7 are not allowed in this version of the
|
Chris@4
|
265 specification. CINFO is not defined in this specification for
|
Chris@4
|
266 CM not equal to 8.
|
Chris@4
|
267
|
Chris@4
|
268 FLG (FLaGs)
|
Chris@4
|
269 This flag byte is divided as follows:
|
Chris@4
|
270
|
Chris@4
|
271 bits 0 to 4 FCHECK (check bits for CMF and FLG)
|
Chris@4
|
272 bit 5 FDICT (preset dictionary)
|
Chris@4
|
273 bits 6 to 7 FLEVEL (compression level)
|
Chris@4
|
274
|
Chris@4
|
275 The FCHECK value must be such that CMF and FLG, when viewed as
|
Chris@4
|
276 a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG),
|
Chris@4
|
277 is a multiple of 31.
|
Chris@4
|
278
|
Chris@4
|
279
|
Chris@4
|
280
|
Chris@4
|
281
|
Chris@4
|
282 Deutsch & Gailly Informational [Page 5]
|
Chris@4
|
283
|
Chris@4
|
284 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
285
|
Chris@4
|
286
|
Chris@4
|
287 FDICT (Preset dictionary)
|
Chris@4
|
288 If FDICT is set, a DICT dictionary identifier is present
|
Chris@4
|
289 immediately after the FLG byte. The dictionary is a sequence of
|
Chris@4
|
290 bytes which are initially fed to the compressor without
|
Chris@4
|
291 producing any compressed output. DICT is the Adler-32 checksum
|
Chris@4
|
292 of this sequence of bytes (see the definition of ADLER32
|
Chris@4
|
293 below). The decompressor can use this identifier to determine
|
Chris@4
|
294 which dictionary has been used by the compressor.
|
Chris@4
|
295
|
Chris@4
|
296 FLEVEL (Compression level)
|
Chris@4
|
297 These flags are available for use by specific compression
|
Chris@4
|
298 methods. The "deflate" method (CM = 8) sets these flags as
|
Chris@4
|
299 follows:
|
Chris@4
|
300
|
Chris@4
|
301 0 - compressor used fastest algorithm
|
Chris@4
|
302 1 - compressor used fast algorithm
|
Chris@4
|
303 2 - compressor used default algorithm
|
Chris@4
|
304 3 - compressor used maximum compression, slowest algorithm
|
Chris@4
|
305
|
Chris@4
|
306 The information in FLEVEL is not needed for decompression; it
|
Chris@4
|
307 is there to indicate if recompression might be worthwhile.
|
Chris@4
|
308
|
Chris@4
|
309 compressed data
|
Chris@4
|
310 For compression method 8, the compressed data is stored in the
|
Chris@4
|
311 deflate compressed data format as described in the document
|
Chris@4
|
312 "DEFLATE Compressed Data Format Specification" by L. Peter
|
Chris@4
|
313 Deutsch. (See reference [3] in Chapter 3, below)
|
Chris@4
|
314
|
Chris@4
|
315 Other compressed data formats are not specified in this version
|
Chris@4
|
316 of the zlib specification.
|
Chris@4
|
317
|
Chris@4
|
318 ADLER32 (Adler-32 checksum)
|
Chris@4
|
319 This contains a checksum value of the uncompressed data
|
Chris@4
|
320 (excluding any dictionary data) computed according to Adler-32
|
Chris@4
|
321 algorithm. This algorithm is a 32-bit extension and improvement
|
Chris@4
|
322 of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073
|
Chris@4
|
323 standard. See references [4] and [5] in Chapter 3, below)
|
Chris@4
|
324
|
Chris@4
|
325 Adler-32 is composed of two sums accumulated per byte: s1 is
|
Chris@4
|
326 the sum of all bytes, s2 is the sum of all s1 values. Both sums
|
Chris@4
|
327 are done modulo 65521. s1 is initialized to 1, s2 to zero. The
|
Chris@4
|
328 Adler-32 checksum is stored as s2*65536 + s1 in most-
|
Chris@4
|
329 significant-byte first (network) order.
|
Chris@4
|
330
|
Chris@4
|
331
|
Chris@4
|
332
|
Chris@4
|
333
|
Chris@4
|
334
|
Chris@4
|
335
|
Chris@4
|
336
|
Chris@4
|
337
|
Chris@4
|
338 Deutsch & Gailly Informational [Page 6]
|
Chris@4
|
339
|
Chris@4
|
340 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
341
|
Chris@4
|
342
|
Chris@4
|
343 2.3. Compliance
|
Chris@4
|
344
|
Chris@4
|
345 A compliant compressor must produce streams with correct CMF, FLG
|
Chris@4
|
346 and ADLER32, but need not support preset dictionaries. When the
|
Chris@4
|
347 zlib data format is used as part of another standard data format,
|
Chris@4
|
348 the compressor may use only preset dictionaries that are specified
|
Chris@4
|
349 by this other data format. If this other format does not use the
|
Chris@4
|
350 preset dictionary feature, the compressor must not set the FDICT
|
Chris@4
|
351 flag.
|
Chris@4
|
352
|
Chris@4
|
353 A compliant decompressor must check CMF, FLG, and ADLER32, and
|
Chris@4
|
354 provide an error indication if any of these have incorrect values.
|
Chris@4
|
355 A compliant decompressor must give an error indication if CM is
|
Chris@4
|
356 not one of the values defined in this specification (only the
|
Chris@4
|
357 value 8 is permitted in this version), since another value could
|
Chris@4
|
358 indicate the presence of new features that would cause subsequent
|
Chris@4
|
359 data to be interpreted incorrectly. A compliant decompressor must
|
Chris@4
|
360 give an error indication if FDICT is set and DICTID is not the
|
Chris@4
|
361 identifier of a known preset dictionary. A decompressor may
|
Chris@4
|
362 ignore FLEVEL and still be compliant. When the zlib data format
|
Chris@4
|
363 is being used as a part of another standard format, a compliant
|
Chris@4
|
364 decompressor must support all the preset dictionaries specified by
|
Chris@4
|
365 the other format. When the other format does not use the preset
|
Chris@4
|
366 dictionary feature, a compliant decompressor must reject any
|
Chris@4
|
367 stream in which the FDICT flag is set.
|
Chris@4
|
368
|
Chris@4
|
369 3. References
|
Chris@4
|
370
|
Chris@4
|
371 [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification",
|
Chris@4
|
372 available in ftp://ftp.uu.net/pub/archiving/zip/doc/
|
Chris@4
|
373
|
Chris@4
|
374 [2] Thomas Boutell, "PNG (Portable Network Graphics) specification",
|
Chris@4
|
375 available in ftp://ftp.uu.net/graphics/png/documents/
|
Chris@4
|
376
|
Chris@4
|
377 [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification",
|
Chris@4
|
378 available in ftp://ftp.uu.net/pub/archiving/zip/doc/
|
Chris@4
|
379
|
Chris@4
|
380 [4] Fletcher, J. G., "An Arithmetic Checksum for Serial
|
Chris@4
|
381 Transmissions," IEEE Transactions on Communications, Vol. COM-30,
|
Chris@4
|
382 No. 1, January 1982, pp. 247-252.
|
Chris@4
|
383
|
Chris@4
|
384 [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms,"
|
Chris@4
|
385 November, 1993, pp. 144, 145. (Available from
|
Chris@4
|
386 gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073.
|
Chris@4
|
387
|
Chris@4
|
388
|
Chris@4
|
389
|
Chris@4
|
390
|
Chris@4
|
391
|
Chris@4
|
392
|
Chris@4
|
393
|
Chris@4
|
394 Deutsch & Gailly Informational [Page 7]
|
Chris@4
|
395
|
Chris@4
|
396 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
397
|
Chris@4
|
398
|
Chris@4
|
399 4. Source code
|
Chris@4
|
400
|
Chris@4
|
401 Source code for a C language implementation of a "zlib" compliant
|
Chris@4
|
402 library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/.
|
Chris@4
|
403
|
Chris@4
|
404 5. Security Considerations
|
Chris@4
|
405
|
Chris@4
|
406 A decoder that fails to check the ADLER32 checksum value may be
|
Chris@4
|
407 subject to undetected data corruption.
|
Chris@4
|
408
|
Chris@4
|
409 6. Acknowledgements
|
Chris@4
|
410
|
Chris@4
|
411 Trademarks cited in this document are the property of their
|
Chris@4
|
412 respective owners.
|
Chris@4
|
413
|
Chris@4
|
414 Jean-Loup Gailly and Mark Adler designed the zlib format and wrote
|
Chris@4
|
415 the related software described in this specification. Glenn
|
Chris@4
|
416 Randers-Pehrson converted this document to RFC and HTML format.
|
Chris@4
|
417
|
Chris@4
|
418 7. Authors' Addresses
|
Chris@4
|
419
|
Chris@4
|
420 L. Peter Deutsch
|
Chris@4
|
421 Aladdin Enterprises
|
Chris@4
|
422 203 Santa Margarita Ave.
|
Chris@4
|
423 Menlo Park, CA 94025
|
Chris@4
|
424
|
Chris@4
|
425 Phone: (415) 322-0103 (AM only)
|
Chris@4
|
426 FAX: (415) 322-1734
|
Chris@4
|
427 EMail: <ghost@aladdin.com>
|
Chris@4
|
428
|
Chris@4
|
429
|
Chris@4
|
430 Jean-Loup Gailly
|
Chris@4
|
431
|
Chris@4
|
432 EMail: <gzip@prep.ai.mit.edu>
|
Chris@4
|
433
|
Chris@4
|
434 Questions about the technical content of this specification can be
|
Chris@4
|
435 sent by email to
|
Chris@4
|
436
|
Chris@4
|
437 Jean-Loup Gailly <gzip@prep.ai.mit.edu> and
|
Chris@4
|
438 Mark Adler <madler@alumni.caltech.edu>
|
Chris@4
|
439
|
Chris@4
|
440 Editorial comments on this specification can be sent by email to
|
Chris@4
|
441
|
Chris@4
|
442 L. Peter Deutsch <ghost@aladdin.com> and
|
Chris@4
|
443 Glenn Randers-Pehrson <randeg@alumni.rpi.edu>
|
Chris@4
|
444
|
Chris@4
|
445
|
Chris@4
|
446
|
Chris@4
|
447
|
Chris@4
|
448
|
Chris@4
|
449
|
Chris@4
|
450 Deutsch & Gailly Informational [Page 8]
|
Chris@4
|
451
|
Chris@4
|
452 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
453
|
Chris@4
|
454
|
Chris@4
|
455 8. Appendix: Rationale
|
Chris@4
|
456
|
Chris@4
|
457 8.1. Preset dictionaries
|
Chris@4
|
458
|
Chris@4
|
459 A preset dictionary is specially useful to compress short input
|
Chris@4
|
460 sequences. The compressor can take advantage of the dictionary
|
Chris@4
|
461 context to encode the input in a more compact manner. The
|
Chris@4
|
462 decompressor can be initialized with the appropriate context by
|
Chris@4
|
463 virtually decompressing a compressed version of the dictionary
|
Chris@4
|
464 without producing any output. However for certain compression
|
Chris@4
|
465 algorithms such as the deflate algorithm this operation can be
|
Chris@4
|
466 achieved without actually performing any decompression.
|
Chris@4
|
467
|
Chris@4
|
468 The compressor and the decompressor must use exactly the same
|
Chris@4
|
469 dictionary. The dictionary may be fixed or may be chosen among a
|
Chris@4
|
470 certain number of predefined dictionaries, according to the kind
|
Chris@4
|
471 of input data. The decompressor can determine which dictionary has
|
Chris@4
|
472 been chosen by the compressor by checking the dictionary
|
Chris@4
|
473 identifier. This document does not specify the contents of
|
Chris@4
|
474 predefined dictionaries, since the optimal dictionaries are
|
Chris@4
|
475 application specific. Standard data formats using this feature of
|
Chris@4
|
476 the zlib specification must precisely define the allowed
|
Chris@4
|
477 dictionaries.
|
Chris@4
|
478
|
Chris@4
|
479 8.2. The Adler-32 algorithm
|
Chris@4
|
480
|
Chris@4
|
481 The Adler-32 algorithm is much faster than the CRC32 algorithm yet
|
Chris@4
|
482 still provides an extremely low probability of undetected errors.
|
Chris@4
|
483
|
Chris@4
|
484 The modulo on unsigned long accumulators can be delayed for 5552
|
Chris@4
|
485 bytes, so the modulo operation time is negligible. If the bytes
|
Chris@4
|
486 are a, b, c, the second sum is 3a + 2b + c + 3, and so is position
|
Chris@4
|
487 and order sensitive, unlike the first sum, which is just a
|
Chris@4
|
488 checksum. That 65521 is prime is important to avoid a possible
|
Chris@4
|
489 large class of two-byte errors that leave the check unchanged.
|
Chris@4
|
490 (The Fletcher checksum uses 255, which is not prime and which also
|
Chris@4
|
491 makes the Fletcher check insensitive to single byte changes 0 <->
|
Chris@4
|
492 255.)
|
Chris@4
|
493
|
Chris@4
|
494 The sum s1 is initialized to 1 instead of zero to make the length
|
Chris@4
|
495 of the sequence part of s2, so that the length does not have to be
|
Chris@4
|
496 checked separately. (Any sequence of zeroes has a Fletcher
|
Chris@4
|
497 checksum of zero.)
|
Chris@4
|
498
|
Chris@4
|
499
|
Chris@4
|
500
|
Chris@4
|
501
|
Chris@4
|
502
|
Chris@4
|
503
|
Chris@4
|
504
|
Chris@4
|
505
|
Chris@4
|
506 Deutsch & Gailly Informational [Page 9]
|
Chris@4
|
507
|
Chris@4
|
508 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
509
|
Chris@4
|
510
|
Chris@4
|
511 9. Appendix: Sample code
|
Chris@4
|
512
|
Chris@4
|
513 The following C code computes the Adler-32 checksum of a data buffer.
|
Chris@4
|
514 It is written for clarity, not for speed. The sample code is in the
|
Chris@4
|
515 ANSI C programming language. Non C users may find it easier to read
|
Chris@4
|
516 with these hints:
|
Chris@4
|
517
|
Chris@4
|
518 & Bitwise AND operator.
|
Chris@4
|
519 >> Bitwise right shift operator. When applied to an
|
Chris@4
|
520 unsigned quantity, as here, right shift inserts zero bit(s)
|
Chris@4
|
521 at the left.
|
Chris@4
|
522 << Bitwise left shift operator. Left shift inserts zero
|
Chris@4
|
523 bit(s) at the right.
|
Chris@4
|
524 ++ "n++" increments the variable n.
|
Chris@4
|
525 % modulo operator: a % b is the remainder of a divided by b.
|
Chris@4
|
526
|
Chris@4
|
527 #define BASE 65521 /* largest prime smaller than 65536 */
|
Chris@4
|
528
|
Chris@4
|
529 /*
|
Chris@4
|
530 Update a running Adler-32 checksum with the bytes buf[0..len-1]
|
Chris@4
|
531 and return the updated checksum. The Adler-32 checksum should be
|
Chris@4
|
532 initialized to 1.
|
Chris@4
|
533
|
Chris@4
|
534 Usage example:
|
Chris@4
|
535
|
Chris@4
|
536 unsigned long adler = 1L;
|
Chris@4
|
537
|
Chris@4
|
538 while (read_buffer(buffer, length) != EOF) {
|
Chris@4
|
539 adler = update_adler32(adler, buffer, length);
|
Chris@4
|
540 }
|
Chris@4
|
541 if (adler != original_adler) error();
|
Chris@4
|
542 */
|
Chris@4
|
543 unsigned long update_adler32(unsigned long adler,
|
Chris@4
|
544 unsigned char *buf, int len)
|
Chris@4
|
545 {
|
Chris@4
|
546 unsigned long s1 = adler & 0xffff;
|
Chris@4
|
547 unsigned long s2 = (adler >> 16) & 0xffff;
|
Chris@4
|
548 int n;
|
Chris@4
|
549
|
Chris@4
|
550 for (n = 0; n < len; n++) {
|
Chris@4
|
551 s1 = (s1 + buf[n]) % BASE;
|
Chris@4
|
552 s2 = (s2 + s1) % BASE;
|
Chris@4
|
553 }
|
Chris@4
|
554 return (s2 << 16) + s1;
|
Chris@4
|
555 }
|
Chris@4
|
556
|
Chris@4
|
557 /* Return the adler32 of the bytes buf[0..len-1] */
|
Chris@4
|
558
|
Chris@4
|
559
|
Chris@4
|
560
|
Chris@4
|
561
|
Chris@4
|
562 Deutsch & Gailly Informational [Page 10]
|
Chris@4
|
563
|
Chris@4
|
564 RFC 1950 ZLIB Compressed Data Format Specification May 1996
|
Chris@4
|
565
|
Chris@4
|
566
|
Chris@4
|
567 unsigned long adler32(unsigned char *buf, int len)
|
Chris@4
|
568 {
|
Chris@4
|
569 return update_adler32(1L, buf, len);
|
Chris@4
|
570 }
|
Chris@4
|
571
|
Chris@4
|
572
|
Chris@4
|
573
|
Chris@4
|
574
|
Chris@4
|
575
|
Chris@4
|
576
|
Chris@4
|
577
|
Chris@4
|
578
|
Chris@4
|
579
|
Chris@4
|
580
|
Chris@4
|
581
|
Chris@4
|
582
|
Chris@4
|
583
|
Chris@4
|
584
|
Chris@4
|
585
|
Chris@4
|
586
|
Chris@4
|
587
|
Chris@4
|
588
|
Chris@4
|
589
|
Chris@4
|
590
|
Chris@4
|
591
|
Chris@4
|
592
|
Chris@4
|
593
|
Chris@4
|
594
|
Chris@4
|
595
|
Chris@4
|
596
|
Chris@4
|
597
|
Chris@4
|
598
|
Chris@4
|
599
|
Chris@4
|
600
|
Chris@4
|
601
|
Chris@4
|
602
|
Chris@4
|
603
|
Chris@4
|
604
|
Chris@4
|
605
|
Chris@4
|
606
|
Chris@4
|
607
|
Chris@4
|
608
|
Chris@4
|
609
|
Chris@4
|
610
|
Chris@4
|
611
|
Chris@4
|
612
|
Chris@4
|
613
|
Chris@4
|
614
|
Chris@4
|
615
|
Chris@4
|
616
|
Chris@4
|
617
|
Chris@4
|
618 Deutsch & Gailly Informational [Page 11]
|
Chris@4
|
619
|