Base64是一种网络上十分常见的编码算法,主要是对ASCII码进行编码,网络上经常用它来对8Bit字节代码进行编码,编码后的字符是数组table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef

ghijklmnopqrstuvwxyz01234567890+/", 即:26的大小,写字母,10个数字,一个"+",一个"/",特殊时候再加"="共64+1=65个字符,不明白为什么不叫Base65.经编码后的字符不会再出现其他的字符.ASCII码由8位(最高位为0,最小0,最大127)二进制数组成,而Base64要求将输入的字符串的每一位都化为其二进制形式,6位一分组(最大为63<64),这个6位二进制数的十进制值作为上面数组的下标,该下标对应的字符就是该所求字符对应Base64编码结果.例如字符串"rui",三个字符对应的ASCII码的二进制位(左高右低):011100100111010101101001六位一组:011100,100111,010101,101001对应的十进制数分别为:28,39,21,41.然后(数组下标是从0开始的)分别对应于 table[28]=c,table[39]=n,table[21]=V,table[41]=p.所以"rui"对应的Base64编码就是:cnVp;可以看出编码后的长度是原来长度的4/3倍.一个数字除以3,可余:0,1,2.余0的已经说过了,当分组后单下一个的时候(即余1的时候),就用该字符的高6位的十进制去查一次表,再用低2位去查一次表,最后不要忘了再在最后加上两个"="号,这是Base64编码的规定,例如:"core",分组后单下e,e对应的ASCII码为01100101,分为011001即:25,table[25]=Z此时剩下的01要先放再高位去,然后再补四个0,即:16,table[16]=Q,加上前面三个字符cor的编码结果Y29y,别忘了加上两个"=",最终"core"的 Base64编码结果为Y29yZQ==.当单下两个字符(即余2的时候),余下的两位共2*8=16个二进制位,前12位都可以直接查出他们对应的编码值,而剩下的4个比特位先将他们移到高位,后面补两个0,再加一个"=",例如"lirui",其中"lir"结果为"bGly","ui"的二进制为:01110101011001,前12位分别对应table[36]=d,table[22]=W.最后剩下的四位先移至高位,低两位补0,加上"lir"的编码为bGly,所以lirui的编码为bGlydWk=.

Base64编码常用于:SMTP协议中对登录用户名的验证,迅雷的下载地址等.

如下是C语言版的Base64编码:

#include#include#includeint in_len;

char *out_str;

char * base64_encodar (char *in_str)

{

int i=0;

char base64_table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz0123456789+/";

int curr_out=0;

if(in_len>0)

{

while(i{

char a=in_str[i];

char b=i+1>=in_len?0:in_str[i+1];

char c=i+2>=in_len?0:in_str[i+2];

if(i+2{

out_str[curr_out++]=base64_table[(a>>2)&(0x3f)];         //the first

out_str[curr_out++]=base64_table[((a&0x03)<<4)+(b>>4)];    //the first and the second

out_str[curr_out++]=base64_table[((b&0x0f)<<2)+(c>>6)];    //the second and the third

out_str[curr_out++]=base64_table[c&0x3f];           //the third

}

else if(i+1{

out_str[curr_out++]=base64_table[(a>>2)&(0x3f)];   //the first

out_str[curr_out++]=base64_table[((a&0x03)<<4)+(b>>4)];  //the first and the second

out_str[curr_out++]=base64_table[(b&0x0f)<<2];     //the last low 4 bits of the second

out_str[curr_out++]='=';   //fill with the '='

}

else                          /*余1*/

{

out_str[curr_out++]=base64_table[(a>>2)&(0x3f)];  //the first

out_str[curr_out++]=base64_table[(a&(0x03))<<4];  //the rest of of the first

out_str[curr_out++]='=';    //fill with  '=' in the last two bits

out_str[curr_out++]='=';

}

i+=3;

}

out_str[curr_out]='\0';

}

return out_str;

};

int main(int argc,char **argv)

{

char x[128];

printf("Please input the String:\n");

scanf("%s",x);

in_len=strlen(x);

out_str=(char*)malloc(4/3*in_len+1);

strcpy(x,base64_encode(x));

printf("the base64 encode is:\n%s\n",x);

return 0;

}

c语言图片base64编码,C语言实现Base64编码相关推荐

  1. python 为什么动态语言图片_聊聊动态语言那些事(Python)

    动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...

  2. golang中base64编码_Go语言教程:Base64编码

    概念简介 Go语言提供内建的 base64 编解码支持. 例程代码 package main // 这个语法引入了 `encoding/base64` 包并使用名称 `b64` // 代替默认的 `b ...

  3. go 连接服务器 并存放图片_基于 Go 语言开发在线论坛(二):通过模型类与MySQL数据库交互...

    在这篇教程中,我们将在 MySQL 中创建一个 chitchat 数据库作为论坛项目的数据库,然后在 Go 项目中编写模型类与之进行交互.你可以本地安装 MySQL 数据库,也可以基于 Docker ...

  4. 易语言图片上传post

    易语言图片上传一直是新手的难题,那么今天给大家来说一说怎么写, 废话不多说直接上代码 这里说下呀.无非就是原来的话我们提交数据是以文本方式提交 但是图片的话我们要用字节集提交. 因为我们抓的包.给我们 ...

  5. R语言使用forestplot包绘制森林图:编码创建森林图仿真数据、汇总线修改、元素位置调整、垂直线、字体、风格、置信区间、线型、图例、刻度、标签等

    R语言使用forestplot包绘制森林图:编码创建森林图仿真数据.汇总线修改.元素位置调整.垂直线.字体.风格.置信区间.线型.图例.刻度.标签等 目录

  6. 语言图片渐入代码_这个可能打败Python的编程语言,正在征服科学界

    图片来源:Unsplash Julia 语言是近年来科学世界中出现的一匹黑马.物理学家 Lee Phillips 发表了一篇科普文章,介绍了这种科学计算语言的真正魅力所在. 本文转载自公众号" ...

  7. HuffMan编码C语言实现

    HuffMan编码C语言实现 实现了一种编码方式,和两种解码方式. 解码一种使用的是叶子回溯根. 一种使用了从根遍历过程. 代码: HuffManEncoding // // Created by Z ...

  8. 编程中汉字编码和英文编码的语言融合

    编程中既可能出现汉语拼音表意,也长出现英语词语表意.这涉及到汉语表意和英语表意在编程上的融合问题. 如果一般审视汉字(非拼音)出现在代码里,如函数名("绘制直线").汉字变量:&q ...

  9. 一文带你看懂算术编码(C语言)

    算术编码C语言 简介 算术编码是图像压缩的主要算法之一. 是一种无损数据压缩方法,也是一种熵编码的方法.和其它熵编码方法不同的地方在于,其他的熵编码方法通常是把输入的消息分割为符号,然后对每个符号进行 ...

最新文章

  1. 如何在HTML页面中插入百度地图
  2. Java通过链表实现队列
  3. 电脑中的php怎么删除文件夹,php中删除文件夹以及文件夹中的文件的方法
  4. 系统管理找不到请求的服务器,解决Win10无法打开软件提示服务器没有及时响应或控制请求的方法...
  5. e.html5.qq.com,QQ群官网-开放能力
  6. TensorFlow第十步CNN BP 编程求解
  7. SecureCrt 常用命令
  8. 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 (转)
  9. [iOS] 通知详解: iOS 10 UserNotifications -- 附加包Media Attachments
  10. DOS命令:color
  11. 烧钱圈地后,医疗大数据如何变现?
  12. 浅谈JSP编程的网店管理系统构造
  13. 最伟大IT人物10强出炉 乔布斯第一盖茨第三
  14. 常用的几个好用的php集成开发环境
  15. 在WRDS database上下载TAQ数据
  16. Android N 应用内更新
  17. 第15节--神经网络应用--异或判断、手写数字识别
  18. Windows系统-安装RabbitMQ过程详解(附带软件安装包)
  19. 《天池精准医疗大赛-人工智能辅助糖尿病遗传风险预测》模型复现和数据挖掘-企业科研_论文作业
  20. x58添加uefi_X58平台老台式机升级固态硬盘以及三通道内存

热门文章

  1. 管理用户和PROFILE——管理用户——修改用户
  2. lambda表达式对list排序
  3. mysql show 翻页_mysql show操作
  4. Ubuntu18.04创建新的系统用户
  5. centos7安装ssh服务
  6. Linux 权限管理之基本权限
  7. Distributed Representations of Sentences and Documents
  8. iOS.ObjC.Basic-Knowledge
  9. 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(四)
  10. ubuntu11.10乱码解决