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

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: base64.c,v 1.16 1998/10/14 02:40:25 wessels Exp $
  3.  */
  4. #include "config.h"
  5. #if HAVE_STDIO_H
  6. #include <stdio.h>
  7. #endif
  8. #if HAVE_STDLIB_H
  9. #include <stdlib.h>
  10. #endif
  11. static void base64_init(void);
  12. static int base64_initialized = 0;
  13. #define BASE64_VALUE_SZ 256
  14. #define BASE64_RESULT_SZ 8192
  15. int base64_value[BASE64_VALUE_SZ];
  16. const char base64_code[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  17. static void
  18. base64_init(void)
  19. {
  20.     int i;
  21.     for (i = 0; i < BASE64_VALUE_SZ; i++)
  22. base64_value[i] = -1;
  23.     for (i = 0; i < 64; i++)
  24. base64_value[(int) base64_code[i]] = i;
  25.     base64_value['='] = 0;
  26.     base64_initialized = 1;
  27. }
  28. char *
  29. base64_decode(const char *p)
  30. {
  31.     static char result[BASE64_RESULT_SZ];
  32.     int j;
  33.     unsigned int k;
  34.     int c;
  35.     long val;
  36.     if (!p)
  37. return NULL;
  38.     if (!base64_initialized)
  39. base64_init();
  40.     val = c = 0;
  41.     for (j = 0; *p && j + 3 < BASE64_RESULT_SZ; p++) {
  42. k = (int) *p % BASE64_VALUE_SZ;
  43. if (base64_value[k] < 0)
  44.     continue;
  45. val <<= 6;
  46. val += base64_value[k];
  47. if (++c < 4)
  48.     continue;
  49. /* One quantum of four encoding characters/24 bit */
  50. result[j++] = val >> 16; /* High 8 bits */
  51. result[j++] = (val >> 8) & 0xff; /* Mid 8 bits */
  52. result[j++] = val & 0xff; /* Low 8 bits */
  53. val = c = 0;
  54.     }
  55.     result[j] = 0;
  56.     return result;
  57. }
  58. /* adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments */
  59. const char *
  60. base64_encode(const char *decoded_str)
  61. {
  62.     static char result[BASE64_RESULT_SZ];
  63.     int bits = 0;
  64.     int char_count = 0;
  65.     int out_cnt = 0;
  66.     int c;
  67.     if (!decoded_str)
  68. return decoded_str;
  69.     if (!base64_initialized)
  70. base64_init();
  71.     while ((c = *decoded_str++) && out_cnt < sizeof(result) - 1) {
  72. bits += c;
  73. char_count++;
  74. if (char_count == 3) {
  75.     result[out_cnt++] = base64_code[bits >> 18];
  76.     result[out_cnt++] = base64_code[(bits >> 12) & 0x3f];
  77.     result[out_cnt++] = base64_code[(bits >> 6) & 0x3f];
  78.     result[out_cnt++] = base64_code[bits & 0x3f];
  79.     bits = 0;
  80.     char_count = 0;
  81. } else {
  82.     bits <<= 8;
  83. }
  84.     }
  85.     if (char_count != 0) {
  86. bits <<= 16 - (8 * char_count);
  87. result[out_cnt++] = base64_code[bits >> 18];
  88. result[out_cnt++] = base64_code[(bits >> 12) & 0x3f];
  89. if (char_count == 1) {
  90.     result[out_cnt++] = '=';
  91.     result[out_cnt++] = '=';
  92. } else {
  93.     result[out_cnt++] = base64_code[(bits >> 6) & 0x3f];
  94.     result[out_cnt++] = '=';
  95. }
  96.     }
  97.     result[out_cnt] = ''; /* terminate */
  98.     return result;
  99. }