Base64这是一个二进制编码方法转换成可打印字符。主要用于邮件传输。

Base64将64人物(A-Z,a-z,0-9,+,/)由于基本字符集。把所有的符号转换成字符集。

编码:

编码每次3节转为4字节。若输入字节数不是3的倍数。则在末尾填充0字节使其长度为3的倍数。

对于3字节。每次取出6位,并在前面加入2位0构成一个字节。以此字节为下标查找Base64码表(例如以下图)输出相应字符。

每次将3字节转为4字节(3*8=4*6),直至得到整个输入串的编码结果。最后,若之前在输入中加入了1个0字节,则将输出结果最后1字节替换成“=”,若加入了2个0字节,则将输出结果最后2字节替换成“=”。

解码:

Base64解码就是编码的逆过程,要注意解码时每一个字节的前2位0是人为填充的。后6位才是有效位。每次将4字节中的24位有效位提取出来构成3字节就可以。

编码解码过程的核心就是位操作。

Base64码表

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int findindex(char c)
{
for(int i=0;i<64;i++)
{
if(c==table[i])
return i;
}
return -1;
}
void base64enc(const char*src,char*&dst)
{
int slen=strlen(src);
int len=slen;
if(len%3!=0)len=(len/3+1)*3;//长度凑成3的倍数
unsigned char*s=(unsigned char*)malloc(len*sizeof(unsigned char));//此处使用unsigned char,否则无法处理中文输入
memset(s,0,len);
memcpy(s,src,slen);
int dlen=(len/3)*4+1;
dst=(char*)malloc(dlen*sizeof(char));
for(int i=0,j=0;i<len;i+=3)
{
//核心步骤
//**************************************
dst[j]=table[s[i]>>2];
dst[j+1]=table[((s[i]&0X03)<<4)|(s[i+1]>>4)];
dst[j+2]=table[((s[i+1]&0X0F)<<2)|(s[i+2]>>6)];
dst[j+3]=table[s[i+2]&0X3F];
//**************************************
j+=4;
}
free(s);
if(slen%3==1)dst[dlen-2]=dst[dlen-3]='=';
if(slen%3==2)dst[dlen-2]='=';
dst[dlen-1]=0;
} void base64dec(const char*src,char*&dst)
{
int slen=strlen(src);
if(slen%4!=0)return ;
int dlen=(slen/4)*3+1;
char*d=(char*)malloc(dlen*sizeof(char));
int index[4];
for(int i=0,j=0;i<slen;i+=4)
{
for(int k=0;k<4;k++)
{
index[k]=findindex(src[i+k]);
}
//核心步骤
//**************************************
d[j]=index[0]<<2|index[1]>>4;
d[j+1]=index[1]<<4|index[2]>>2;
d[j+2]=index[2]<<6|index[3];
//**************************************
j+=3;
}
//去除src尾部'='的影响
if(src[slen-1]=='='&&src[slen]!='=')
dlen-=1;
if(src[slen-1]=='='&&src[slen]=='=')
dlen-=2;
dst=(char*)malloc(dlen*sizeof(char));
memcpy(dst,d,dlen);
free(d);
dst[dlen-1]=0;
}
int main()
{
char src[]="Hello,小罗";
char*enc,*dec;
base64enc(src,enc);
base64dec(enc,dec);
printf("%s\n",src);
printf("%s\n",enc);
printf("%s\n",dec);
free(enc);
free(dec);
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

Base64编码和解码的更多相关文章

  1. BASE64编码和解码(VC源代码) 并 内存加载 CImage 图像

      BASE64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本.完整的BASE64定义可见 RFC1421和 RFC2045.编码后的数据比原始数据略长,为原来的4/3.在电子 ...

  2. base64编码、解码的C语言实现

    转自:http://www.cnblogs.com/yejianfei/archive/2013/04/06/3002838.html base64是一种基于64个可打印字符来表示二进制数据的表示方法 ...

  3. android Java BASE64编码和解码二:图片的编码和解码

    1.准备工作 (1)在项目中集成 Base64 代码,集成方法见第一篇博文:android Java BASE64编码和解码一:基础 (2)添加 ImgHelper 工具类 package com.a ...

  4. Python中进行Base64编码和解码

    Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...

  5. Javascript Base64编码与解码

    原文:[转]Javascript Base64编码与解码 <html> <head> <META HTTP-EQUIV="MSThemeCompatible&q ...

  6. C# base64编码、解码

    public class TransferCode { #region base-64编码.解码 /// <summary> /// BASE64编码 /// </summary&g ...

  7. Url的Base64编码以及解码

    Base64可以将二进制转码成可见字符方便进行http传输,但是base64转码时会生成“+”,“/”,“=”这些被URL进行转码的特殊字符,导致两方面数据不一致.我们可以在发送前将“+”,“/”,“ ...

  8. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

  9. js的Base64编码与解码

    js的Base64编码与解码 pc和手机app项目中,经常需要将手机自带的表情图片转换特定的编码格式与后台进行交互. Base64其实是一种简单的置换加密方式,但是BASE64的用处往往并不是为了防止 ...

  10. 在Java中如何进行BASE64编码和解码

    在Java中如何进行BASE64编码和解码 //在Java中如何进行BASE64编码和解码 package me.xzh.study.sun.misc.BASE64; import sun.misc. ...

随机推荐

  1. Codeforces Round #253 DIV1 C 馋

    http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...

  2. 牛逼的验证码,printf返回值

    牛逼的验证码,如下图, 结果是4321,为什么呢,主要是printf返回值问题?那么printf到底返回什么? 经查阅,printf的返回值是打印的字符个数,因此结果是4321就很明显了.

  3. 图画(txt等一下)实施开放的默认下载的默认浏览器,而不是(Java文本)

    在网络上,假设我们超链接地址对应于jpg档,txt档,点击链接,默认浏览器打开这些文件,而不是下载,那么,你如何实现竞争力的默认下载. 1.可通过自己写一个download.jsp来实现 <%@ ...

  4. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  5. XML解析中的namespace初探

    原文:XML解析中的namespace初探 初学者在解析XML文件的时候最容易遇到的问题恐怕就是XML的namespace了,本文旨在对namespace做一个简要的介绍. namespace的意义无 ...

  6. Python3.2官方文件翻译--课堂笔记和异常是阶级

    6.7备注 有时喜欢Pasca在"录"和C中"数据体"的数据类型很实用.集合一些数据项. 一个空类定义能够清楚地显示: class Employee: pass ...

  7. hadoop的一些名词解释

    在网上收集了一些mapreduce中常用的一些名词的解释,分享一下: Shuffle(洗牌):当第一个map任务完成后,节点可能还要继续执行更多的map 任务,但这时候也开始把map任务的中间输出交换 ...

  8. Effective C++规定45 额外的代码

    这部分是额外的代码博客,关键45术语思想已经实现. #include<iostream> using namespace std; template<typename T> c ...

  9. 解决ubuntu 14.04在显示屏电缆被拔出的问题

    我是一个ubuntu14.04和win7双系统.于win在正常的网络.但在ubuntu网络连接有一直显示线被拔掉,您只能连接到无线Wi-Fi,没有有线网络. 关于这个问题,,最终找到的一种方式,这是进 ...

  10. #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端

    原文:#Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端 #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的 ...