1/* zlib-adler32.js -- JavaScript implementation for the zlib adler32.
3 LastModified: Apr 12 2012
4 Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
7==============================================================================
8Usage: adler = ZLIB.adler32(adler, buf, offset, len);
10 Update a running Adler-32 checksum with the bytes buf[offset..offset+len-1] and
11 return the updated checksum. If buf is null, this function returns the
12 required initial value for the checksum.
14 An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
19 var adler = ZLIB.adler32(0, null, 0, 0);
21 while (read_buffer(buffer, length) != EOF) {
22 adler = ZLIB.adler32(adler, buffer, 0, length);
24 if (adler != original_adler) error();
26==============================================================================
27Usage: adler = ZLIB.adler32_combine(adler1, adler2, len2);
29 Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
30 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
31 each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
32 seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
33 that the z_off_t type (like off_t) is a signed integer. If len2 is
34 negative, the result has no meaning or utility.
37if( typeof ZLIB === 'undefined' ) {
38 alert('ZLIB is not defined. SRC zlib.js before zlib-adler32.js')
43/* adler32.c -- compute the Adler-32 checksum of a data stream
44 * Copyright (C) 1995-2011 Mark Adler
45 * For conditions of distribution and use, see copyright notice in zlib.h
48var BASE = 65521; /* largest prime smaller than 65536 */
50/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
52/* ========================================================================= */
53function adler32_string(adler, buf, offset, len)
58 /* split Adler-32 into component sums */
59 sum2 = (adler >>> 16) & 0xffff;
62 /* in case user likes doing a byte at a time, keep it fast */
64 adler += buf.charCodeAt(offset) & 0xff;
70 return adler | (sum2 << 16);
73 /* initial Adler-32 value (deferred check for len == 1 speed) */
77 /* in case short lengths are provided, keep it somewhat fast */
80 adler += buf.charCodeAt(offset++) & 0xff;
85 sum2 %= BASE; /* only added so many BASE's */
86 return adler | (sum2 << 16);
89 /* do length NMAX blocks -- requires just one modulo operation */
92 n = NMAX >> 4; /* NMAX is divisible by 16 */
94 /* 16 sums unrolled */
95 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
96 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
97 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
98 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
99 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
100 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
101 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
102 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
103 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
104 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
105 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
106 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
107 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
108 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
109 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
110 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
116 /* do remaining bytes (less than NMAX, still just one modulo) */
117 if (len) { /* avoid modulos if none remaining */
120 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
121 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
122 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
123 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
124 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
125 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
126 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
127 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
128 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
129 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
130 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
131 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
132 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
133 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
134 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
135 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
138 adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
144 /* return recombined sums */
145 return adler | (sum2 << 16);
148/* ========================================================================= */
149function adler32_array(adler, buf, offset, len)
154 /* split Adler-32 into component sums */
155 sum2 = (adler >>> 16) & 0xffff;
158 /* in case user likes doing a byte at a time, keep it fast */
160 adler += buf[offset];
166 return adler | (sum2 << 16);
169 /* initial Adler-32 value (deferred check for len == 1 speed) */
173 /* in case short lengths are provided, keep it somewhat fast */
176 adler += buf[offset++];
181 sum2 %= BASE; /* only added so many BASE's */
182 return adler | (sum2 << 16);
185 /* do length NMAX blocks -- requires just one modulo operation */
186 while (len >= NMAX) {
188 n = NMAX >> 4; /* NMAX is divisible by 16 */
190 /* 16 sums unrolled */
191 adler += buf[offset++]; sum2 += adler;
192 adler += buf[offset++]; sum2 += adler;
193 adler += buf[offset++]; sum2 += adler;
194 adler += buf[offset++]; sum2 += adler;
195 adler += buf[offset++]; sum2 += adler;
196 adler += buf[offset++]; sum2 += adler;
197 adler += buf[offset++]; sum2 += adler;
198 adler += buf[offset++]; sum2 += adler;
199 adler += buf[offset++]; sum2 += adler;
200 adler += buf[offset++]; sum2 += adler;
201 adler += buf[offset++]; sum2 += adler;
202 adler += buf[offset++]; sum2 += adler;
203 adler += buf[offset++]; sum2 += adler;
204 adler += buf[offset++]; sum2 += adler;
205 adler += buf[offset++]; sum2 += adler;
206 adler += buf[offset++]; sum2 += adler;
212 /* do remaining bytes (less than NMAX, still just one modulo) */
213 if (len) { /* avoid modulos if none remaining */
216 adler += buf[offset++]; sum2 += adler;
217 adler += buf[offset++]; sum2 += adler;
218 adler += buf[offset++]; sum2 += adler;
219 adler += buf[offset++]; sum2 += adler;
220 adler += buf[offset++]; sum2 += adler;
221 adler += buf[offset++]; sum2 += adler;
222 adler += buf[offset++]; sum2 += adler;
223 adler += buf[offset++]; sum2 += adler;
224 adler += buf[offset++]; sum2 += adler;
225 adler += buf[offset++]; sum2 += adler;
226 adler += buf[offset++]; sum2 += adler;
227 adler += buf[offset++]; sum2 += adler;
228 adler += buf[offset++]; sum2 += adler;
229 adler += buf[offset++]; sum2 += adler;
230 adler += buf[offset++]; sum2 += adler;
231 adler += buf[offset++]; sum2 += adler;
234 adler += buf[offset++]; sum2 += adler;
240 /* return recombined sums */
241 return adler | (sum2 << 16);
244/* ========================================================================= */
245ZLIB.adler32 = function(adler, buf, offset, len)
247 if(typeof buf === 'string') {
248 return adler32_string(adler, buf, offset, len);
250 return adler32_array(adler, buf, offset, len);
254ZLIB.adler32_combine = function(adler1, adler2, len2)
260 /* for negative len, return invalid adler32 as a clue for debugging */
264 /* the derivation of this formula is left as an exercise for the reader */
265 len2 %= BASE; /* assumes len2 >= 0 */
267 sum1 = adler1 & 0xffff;
270 sum1 += (adler2 & 0xffff) + BASE - 1;
271 sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
272 if (sum1 >= BASE) sum1 -= BASE;
273 if (sum1 >= BASE) sum1 -= BASE;
274 if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
275 if (sum2 >= BASE) sum2 -= BASE;
276 return sum1 | (sum2 << 16);