authsaslfrombase64.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:1k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. #include <stdlib.h>
  2. static int decode64tab_init=0;
  3. static char decode64tab[256];
  4. /*
  5. ** Copyright 1998 - 1999 Double Precision, Inc.
  6. ** See COPYING for distribution information.
  7. */
  8. int authsasl_frombase64(char *base64buf)
  9. {
  10. int i, j, k;
  11. if (!decode64tab_init)
  12. {
  13. for (i=0; i<256; i++) decode64tab[i]=100;
  14. for (i=0; i<64; i++)
  15. decode64tab[ (int)
  16. ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]) ]=i;
  17. decode64tab_init=1;
  18. }
  19. for (j=0; base64buf[j]; j++)
  20. if (decode64tab[(unsigned char)base64buf[j]] >= 100)
  21. break;
  22. if (base64buf[j] && base64buf[j+1] && base64buf[j+2])
  23. return (-1);
  24. while (base64buf[j] == '=') ++j;
  25. if (j % 4) return (-1);
  26. i=j;
  27. k=0;
  28. for (j=0; j<i; j += 4)
  29. {
  30. int w=decode64tab[(int)(unsigned char)base64buf[j]];
  31. int x=decode64tab[(int)(unsigned char)base64buf[j+1]];
  32. int y=decode64tab[(int)(unsigned char)base64buf[j+2]];
  33. int z=decode64tab[(int)(unsigned char)base64buf[j+3]];
  34. int a,b,c;
  35. a= (w << 2) | (x >> 4);
  36. b= (x << 4) | (y >> 2);
  37. c= (y << 6) | z;
  38. base64buf[k++]=a;
  39. if ( base64buf[j+2] != '=')
  40. base64buf[k++]=b;
  41. if ( base64buf[j+3] != '=')
  42. base64buf[k++]=c;
  43. }
  44. return (k);
  45. }