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

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. /*
  6. ** $Id: rfc2045_base64encode.c,v 1.2 1999/12/06 13:29:02 mrsam Exp $
  7. */
  8. #include "rfc2045.h"
  9. static unsigned char base64buf[57];
  10. /* When encoded this becomes 76 characters */
  11. static int base64cnt;
  12. static void (*output_func)(const char *, size_t);
  13. void rfc2045_base64encode_start( void (*func)(const char *, size_t))
  14. {
  15. output_func=func;
  16. base64cnt=0;
  17. }
  18. void rfc2045_base64encode(const char *buf, size_t n)
  19. {
  20. while (n)
  21. {
  22. size_t i;
  23. if (base64cnt == sizeof(base64buf))
  24. {
  25. rfc2045_base64encode_end();
  26. base64cnt=0;
  27. }
  28. i=n;
  29. if (i > sizeof(base64buf) - base64cnt)
  30. i=sizeof(base64buf) - base64cnt;
  31. memcpy(base64buf + base64cnt, buf, i);
  32. base64cnt += i;
  33. buf += i;
  34. n -= i;
  35. }
  36. }
  37. static const char base64tab[]=
  38. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  39. void rfc2045_base64encode_end()
  40. {
  41. int a=0,b=0,c=0;
  42. int i, j;
  43. int d, e, f, g;
  44. char output_buf[ sizeof(base64buf) / 3 * 4+1];
  45. if (base64cnt == 0) return;
  46. for (j=i=0; i<base64cnt; i += 3)
  47. {
  48. a=base64buf[i];
  49. b= i+1 < base64cnt ? base64buf[i+1]:0;
  50. c= i+2 < base64cnt ? base64buf[i+2]:0;
  51. d=base64tab[ a >> 2 ];
  52. e=base64tab[ ((a & 3 ) << 4) | (b >> 4)];
  53. f=base64tab[ ((b & 15) << 2) | (c >> 6)];
  54. g=base64tab[ c & 63 ];
  55. if (i + 1 >= base64cnt) f='=';
  56. if (i + 2 >= base64cnt) g='=';
  57. output_buf[j++]=d;
  58. output_buf[j++]=e;
  59. output_buf[j++]=f;
  60. output_buf[j++]=g;
  61. }
  62. output_buf[j++]='n';
  63. (*output_func)(output_buf, j);
  64. }