Base64算法原理

转载 2006年03月24日 16:37:00
Base64算法将输入的字符串或一段数据编码成只含有{''A''-''Z'', ''a''-''z'', ''0''-''9'', ''+'', ''/''}这64个字符的串,''=''用于填充。其编码的方法是,将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以''=''填充。

 

贴在这里,以后忘了的时候方便查阅:)

 

编码的过程是这样的:

第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
然后将第一个字符左移4位加上第二个字符右移4位,即获得第二个目标字符。
再将第二个字符左移2位加上第三个字符右移6位,获得第三个目标字符。
最后取第三个字符的右6位即获得第四个目标字符。

在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。

实现如下:

00001 
00013 #include <ctype.h>
00014 
00015 
00016 static const char base64digits[] =
00017    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
00018 
00019 #define BAD     -1
00020 static const char base64val[] = {
00021     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
00022     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
00023     BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
00024      52, 53, 54, 55,  56, 57, 58, 59,  60, 61,BAD,BAD, BAD,BAD,BAD,BAD,
00025     BAD,  0,  1,  2,   3,  4,  5,  6,   7,  8,  9, 10,  11, 12, 13, 14,
00026      15, 16, 17, 18,  19, 20, 21, 22,  23, 24, 25,BAD, BAD,BAD,BAD,BAD,
00027     BAD, 26, 27, 28,  29, 30, 31, 32,  33, 34, 35, 36,  37, 38, 39, 40,
00028      41, 42, 43, 44,  45, 46, 47, 48,  49, 50, 51,BAD, BAD,BAD,BAD,BAD
00029 };
00030 #define DECODE64(c)  (isascii(c) ? base64val[c] : BAD)
00031 
00039 void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
00040 {
00041         for (; inlen >= 3; inlen -= 3)
00042         {
00043                 *out++ = base64digits[in[0] >> 2];
00044                 *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
00045                 *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
00046                 *out++ = base64digits[in[2] & 0x3f];
00047                 in += 3;
00048         }
00049 
00050         if (inlen > 0)
00051         {
00052                 unsigned char fragment;
00053 
00054                 *out++ = base64digits[in[0] >> 2];
00055                 fragment = (in[0] << 4) & 0x30;
00056 
00057                 if (inlen > 1)
00058                         fragment |= in[1] >> 4;
00059 
00060                 *out++ = base64digits[fragment];
00061                 *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
00062                 *out++ = '=';
00063         }
00064         
00065         *out = '/0';
00066 }
00067 
00075 int from64tobits(char *out, const char *in)
00076 {
00077         int len = 0;
00078         register unsigned char digit1, digit2, digit3, digit4;
00079 
00080         if (in[0] == '+' && in[1] == ' ')
00081                 in += 2;
00082         if (*in == '/r')
00083                 return(0);
00084 
00085         do {
00086                 digit1 = in[0];
00087                 if (DECODE64(digit1) == BAD)
00088                         return(-1);
00089                 digit2 = in[1];
00090                 if (DECODE64(digit2) == BAD)
00091                         return(-1);
00092                 digit3 = in[2];
00093                 if (digit3 != '=' && DECODE64(digit3) == BAD)
00094                         return(-1);
00095                 digit4 = in[3];
00096                 if (digit4 != '=' && DECODE64(digit4) == BAD)
00097                         return(-1);
00098                 in += 4;
00099                 *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4);
00100                 ++len;
00101                 if (digit3 != '=')
00102                 {
00103                         *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2);
00104                         ++len;
00105                         if (digit4 != '=')
00106                         {
00107                                 *out++ = ((DECODE64(digit3) << 6) & 0xc0) | DECODE64(digit4);
00108                                 ++len;
00109                         }
00110                 }
00111         } while (*in && *in != '/r' && digit4 != '=');
00112 
00113         return (len);
00114 }

相关文章推荐

Base64和3DES加密算法原理

这篇文章是对Base64和3DES算法以及他们如何在iphone平台上实现的一点总结。本文吸收了很多前人的资料和成果,在修正了其中的一些错误的基础上添加了自己的理解。在此向前人出色的工作表示感谢。本文...

base64算法原理及实现

自定义Base64算法java语言实现 参考网上的源码,实现了java版本的base64的加解密package com.base64;public class Base64Encrypt { ...

Base64算法 编码过程和原理

Base64的算法底层原理是怎样的。它的计算过程又是如何。通过这篇文章我们可以了解这些,甚至手算编码。...
  • U2U22
  • U2U22
  • 2016年08月24日 10:40
  • 861

Base64编解码原理及AES加解密算法的使用

Base64编解码 1英文字符=1字节=8位 Base64编码原理:将要编码的二进制(字符串、图片等都可以转换成二进制格式表示)以6位为一组,然后每组都转换成一个单独的数字并映射到base64码表中的...

Base64 算法原理,以及编码、解码【加密、解密】 介绍

源文地址:http://www.cnblogs.com/chengmo/p/3735917.html  Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表...

BASE64 加密算法、原理 各种语言实现算法

简介   标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANS...
  • lgh1117
  • lgh1117
  • 2012年05月25日 15:28
  • 5658

Base64编码解码原理及实现

  • 2011年11月01日 21:15
  • 140KB
  • 下载

Base64编码解码原理

一. Base64编码由来  为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大...

Base64 加密算法

  • 2008年08月01日 01:34
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Base64算法原理
举报原因:
原因补充:

(最多只允许输入30个字)