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. c#怎样获取excel单元格的RGB颜色

    这段时间一直在做office的工作.前2天获取单元格的颜色的问题一直没搞明确. 開始我想用的就是Npoi.主要前一部分的工作都是用Npoi完毕的 row.GetCell(j).CellStyle.Fi ...

  2. excel删除问号~?~

    1.直接替换(菜单)编辑——替换——查找内容——(输入)~?~——替换为(空,就是什么都不输入)——全部替换.2.设原数据在A列,从A1开始,若得到的数值数据需要参与计算,则在B1输入=--LEFT( ...

  3. HDU1071 The area 【积分】

    The area Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. HBaseConvetorUtil 实体转换工具

    HBaseConvetorUtil 实体转换工具类 public class HBaseConvetorUtil {        /**    * @Title: convetor    * @De ...

  5. 使用AngularJS开发下一代Web应用

    原版的:https://github.com/edagarli/AngularJSWeb 来源书:https://github.com/shyamseshadri/angularjs-book 版权声 ...

  6. google多语言通信框架gRPC

    google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找 ...

  7. Follow your hear(跟着心走)

    端午三天的哈尔滨之旅已经over,非常开心真的非常开心.听了刘四风老师的"为爱开讲.我爱这世界"的论坛,尽管.这三天老师讲的不多.可是句句是精华.Follow your heart ...

  8. friend keyword 对于模板 并不只不过友元!!!

    friend是C++中封装的漏网之鱼. C++中的friend同意其它的类或者是函数訪问本类的不论什么成员.甚至是private成员,仅仅要该类声明其为友元. 但是,在有些情况下,并非同意外界訪问类的 ...

  9. Vs2012在Linux应用程序开发(3):加入新平台hi3516

    下面我们将VS2012添加一个新的平台支持,由于近来与哈斯hi3516.就选它吧! 1.1     复制平台文件 原来一直认为要让VS支持一个新的平台须要编写代码,某天在看MSBUILD文件夹的时候突 ...

  10. Visual C++学习笔记1:一定要注意ANSI和UNICODE差额

    最近的研究VC++.下载VS2013,根据<Visual C++开发实战系列>首先hello我写了一个常规样品,结果显示乱码编辑框.夜已经折腾型转变.然后总结很明显ANSI和UNICODE ...