Re: Adler-32

From
Alex Naumoff ()
To
All
Date
2002-12-09T19:50:56Z
Area
RU.ALGORITHMS
Dmitriy Shestakov wrote:
> From: "Dmitriy Shestakov" <dmitriy@aamsystems.ru>
>=20
> Hi!
>=20
> =E1 =CB=D4=CF =DA=CE=C1=C5=D4, =D7 =DE=C5=CD =D3=D5=D4=D8 =C1=CC=C7=CF=D2=
=C9=D4=CD=C1 =D0=CF=C4=D3=DE=C5=D4=C1 =CB=CF=CE=D4=D2=CF=CC=D8=CE=CF=CA =D3=
=D5=CD=CD=D9 Adler-32 ? =E9 =D7
> =DE=C5=CD =CF=D4=CC=C9=DE=C9=C5 =CF=D4 CRC32?
>=20
>=20
>=20
=E4=C5=CE=D8 =C4=CF=C2=D2=D9=CA.

RFC =CE=C5 =D0=CF=CD=CE=C0.

CRC - =DC=D4=CF =D0=CF=CC=C9=CE=CF=CD=C9=C1=CC=D8=CE=D9=CA =C1=CC=C7=CF=D2=
=C9=D4=CD. =FE=D4=CF =D3=CC=C5=C4=D5=C5=D4 =C9=DA =D0=C5=D2=C5=D7=CF=C4=C1=

=D2=C1=D3=DB=C9=C6=D2=CF=D7=CB=C9 =C1=CE=C7=CC=C9=CA=D3=CB=CF=C7=CF =C1=CB=
=D2=CF=CE=C9=CD=C1.

Adler-32 =D1=D7=CC=D1=C5=D4=D3=D1 =C1=D2=C9=C6=CD=C5=D4=C9=DE=C5=D3=CB=C9=
=CD.
=E5=D3=CC=C9 =CE=C5 =CF=DB=C9=C2=C1=C0=D3=D8, =DC=D4=CF =CD=CF=C4=C9=C6=C9=
=C3=C9=D2=CF=D7=C1=CE=CE=D9=CA =C1=CC=C7=CF=D2=C9=D4=CD =E6=CC=C5=D4=DE=C5=
=D2=C1 - =D5=D7=C5=CC=C9=DE=C5=CE=C1=20
=D2=C1=DA=D2=D1=C4=CE=CF=D3=D4=D8.

=EB=CF=C4 =CD=CF=D6=CE=CF =D0=CF=D3=CD=CF=D4=D2=C5=D4=D8 =D7 zlib, =C6=C1=
=CA=CC adler32.c:

/* adler32.c -- compute the Adler-32 checksum of a data stream
  * Copyright (C) 1995-1998 Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.=
h
  */

/* @(#) $FreeBSD: src/lib/libz/adler32.c,v 1.5 1999/08/28 00:06:00 peter =

Exp $ */

#include "zlib.h"

#define BASE 65521L /* largest prime smaller than 65536 */
#define NMAX 5552
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <=3D 2^32-=
1 */

#define DO1(buf,i)  {s1 +=3D buf[i]; s2 +=3D s1;}
#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
#define DO16(buf)   DO8(buf,0); DO8(buf,8);

/*=20
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D */
uLong ZEXPORT adler32(adler, buf, len)
     uLong adler;
     const Bytef *buf;
     uInt len;
{
     unsigned long s1 =3D adler & 0xffff;
     unsigned long s2 =3D (adler >> 16) & 0xffff;
     int k;

     if (buf =3D=3D Z_NULL) return 1L;

     while (len > 0) {
         k =3D len < NMAX ? len : NMAX;
         len -=3D k;
         while (k >=3D 16) {
             DO16(buf);
	    buf +=3D 16;
             k -=3D 16;
         }
         if (k !=3D 0) do {
             s1 +=3D *buf++;
	    s2 +=3D s1;
         } while (--k);
         s1 %=3D BASE;
         s2 %=3D BASE;
     }
     return (s2 << 16) | s1;
}


=E1=CC=C5=CB=D3=C1=CE=C4=D2 =EE=C1=D5=CD=CF=D7,
alx@relex.ru

--- Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.2) Gecko/20021126
 * Origin: Relex, Inc. (2:5025/17@fidonet)