Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4589373
  • 博文数量: 671
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 7310
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-14 09:56
文章分类

全部博文(671)

文章存档

2011年(1)

2010年(2)

2009年(24)

2008年(271)

2007年(319)

2006年(54)

我的朋友

分类:

2007-04-25 09:55:47

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在发送电子邮件时,服务器认证的用户名和密码需要用Base64编码,附件也需要用Base64编码。 
    下面简单介绍Base64算法的原理,由于代码太长就不在此贴出Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。转换后,我们用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的: 
0 A 17 R 34 i 51 z 
1 B 18 S 35 j 52 0 
2 C 19 T 36 k 53 1 
3 D 20 U 37 l 54 2 
4 E 21 V 38 m 55 3 
5 F 22 W 39 n 56 4 
6 G 23 X 40 o 57 5 
7 H 24 Y 41 p 58 6 
8 I 25 Z 42 q 59 7 
9 J 26 a 43 r 60 8 
10 K 27 b 44 s 61 9 
11 L 28 c 45 t 62 + 
12 M 29 d 46 u 63 / 
13 N 30 e 47 v 
14 O 31 f 48 w (pad) = 
15 P 32 g 49 x 
16 Q 33 h 50 y 
原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,但等号最多只有两个。 
举一个例子,abc经过Base64编码以后的结果是YWJj. 

发邮件的时候所写的信息自动在后台转换然后传输...

 

#include
#include
#include

static char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int
base64_encode(const void *data, int size, char **str)
{
    char *s, *p;
    int i;
    int c;
    const unsigned char *q;
 
    p = s = (char *) malloc(size * 4 / 3 + 4);
    if (p == NULL)
  return -1;
    q = (const unsigned char *) data;
    i = 0;
    for (i = 0; i < size;) {
  c = q[i++];
  c *= 256;
  if (i < size)
   c += q[i];
  i++;
  c *= 256;
  if (i < size)
   c += q[i];
  i++;
  p[0] = base64_chars[(c & 0x00fc0000) >> 18];
  p[1] = base64_chars[(c & 0x0003f000) >> 12];
  p[2] = base64_chars[(c & 0x00000fc0) >> 6];
  p[3] = base64_chars[(c & 0x0000003f) >> 0];
  if (i > size)
   p[3] = '=';
  if (i > size + 1)
   p[2] = '=';
  p += 4;
    }
    *p = 0;
    *str = s;
    return strlen(s);
}

#if NTLM

static int
pos(char c)
{
    char *p;
    for (p = base64_chars; *p; p++)
  if (*p == c)
   return p - base64_chars;
  return -1;
}

#define DECODE_ERROR 0xffffffff

static unsigned int
token_decode(const char *token)
{
    int i;
    unsigned int val = 0;
    int marker = 0;
    if (strlen(token) < 4)
  return DECODE_ERROR;
    for (i = 0; i < 4; i++) {
  val *= 64;
  if (token[i] == '=')
   marker++;
  else if (marker > 0)
   return DECODE_ERROR;
  else
   val += pos(token[i]);
    }
    if (marker > 2)
  return DECODE_ERROR;
    return (marker << 24) | val;
}

int
base64_decode(const char *str, void *data)
{
    const char *p;
    unsigned char *q;
 
    q = data;
    for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) {
  unsigned int val = token_decode(p);
  unsigned int marker = (val >> 24) & 0xff;
  if (val == DECODE_ERROR)
   return -1;
  *q++ = (val >> 16) & 0xff;
  if (marker < 2)
   *q++ = (val >> 8) & 0xff;
  if (marker < 1)
   *q++ = val & 0xff;
    }
    return q - (unsigned char *) data;
}
#endif

阅读(4520) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~