adler32.c
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:1k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* adler32.c -- compute the Adler-32 checksum of a data stream
  2.  * Copyright (C) 1995-2003 Mark Adler
  3.  * For conditions of distribution and use, see copyright notice in zlib.h
  4.  */
  5. /* @(#) $Id: adler32.c,v 1.1 2005/11/23 14:29:59 stingerx Exp $ */
  6. #define ZLIB_INTERNAL
  7. #include "zlib.h"
  8. #define DO1(buf,i)  { s1 += buf[i]; s2 += s1; }
  9. #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
  10. #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
  11. #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
  12. #define DO16(buf)   DO8(buf,0); DO8(buf,8);
  13. /* ========================================================================= */
  14. DWORD ZEXPORT adler32(DWORD adler, const BYTE *buf, DWORD len)
  15. {
  16.   DWORD s1 = adler &0xFFFF;
  17.   DWORD s2 = (adler >> 16) &0xFFFF;
  18.   DWORD k;
  19.   if (buf == Z_NULL)
  20.   {
  21.     return 1;
  22.   }
  23.   while (len)
  24.   {
  25.     k = len < 5552 ? len : 5552;
  26.     len -= k;
  27.     while (k >= 16)
  28.     {
  29.       DO16(buf);
  30.       buf += 16;
  31.       k -= 16;
  32.     }
  33.     while (k)
  34.     {
  35.       s1 +=  *buf++;
  36.       s2 += s1;
  37.       k--;
  38.     }
  39.     s1 = s1 % 65521;
  40.     s2 = s2 % 65521;
  41.   }
  42.   return (s2 << 16) | s1;
  43. }