base64.c
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /*
  2. base64.c
  3. Copyright (C) 1999 Lars Brinkhoff.  See COPYING for terms and conditions.
  4. */
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include "base64.h"
  8. static int encode[] =
  9. {
  10.   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  11.   'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  12.   'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  13.   'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  14.   'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  15.   'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  16.   'w', 'x', 'y', 'z', '0', '1', '2', '3',
  17.   '4', '5', '6', '7', '8', '9', '+', '/'
  18. };
  19. /*
  20.   Base64-encode LENGTH bytes of DATA in *CODE, which will be a newly
  21.   malloced area.  *CODE will be a null-terminated string.
  22.   Return -1 on failure, or number of bytes of base64 code on success.
  23.  */
  24. size_t
  25. encode_base64 (const void *data, size_t length, char **code)
  26. {
  27.   const unsigned char *s, *end;
  28.   unsigned char *buf;
  29.   unsigned int x;
  30.   size_t n;
  31.   int i, j;
  32.   if (length == 0)
  33.     return 0;
  34.   end = (char *)data + length - 3;
  35.   buf = malloc (4 * ((length + 2) / 3) + 1);
  36.   if (buf == NULL)
  37.     return -1;
  38.   n = 0;
  39.   for (s = data; s < end;)
  40.     {
  41.       x = *s++ << 24;
  42.       x |= *s++ << 16;
  43.       x |= *s++ << 8;
  44.       *buf++ = encode[x >> 26];
  45.       x <<= 6;
  46.       *buf++ = encode[x >> 26];
  47.       x <<= 6;
  48.       *buf++ = encode[x >> 26];
  49.       x <<= 6;
  50.       *buf++ = encode[x >> 26];
  51.       n += 4;
  52.     }
  53.   end += 3;
  54.   x = 0;
  55.   for (i = 0; s < end; i++)
  56.     x |= *s++ << (24 - 8 * i);
  57.   for (j = 0; j < 4; j++)
  58.     {
  59.       if (8 * i >= 6 * j)
  60. {
  61.   *buf++ = encode [x >> 26];
  62.   x <<= 6;
  63.   n++;
  64. }
  65.       else
  66. {
  67.   *buf++ = '=';
  68.   n++;
  69. }
  70.     }
  71.   *buf = 0;
  72.   *code = buf - n;
  73.   return n;
  74. }