base64编码

简介

base64编码可以将任意二进制数据编码为只包含由定义的64个ascⅡ字符构成的字符串,方便通过某些不支持二进制数据的协议传递二进制文件。

编码方式

因为base64编码的编码表只有64个字符,每一个字符只能对应6位二进制数($2^6=64$),因此需要把6bit的原始数据编码成一个字符(8bit),但这样会留下2bit无法编码,所以我们需要把3byte(46bit)的原始数据作为一个编码单元编码为4byte(48bit)的字符串。当然这样仍然可能余下1byte或者2byte数据不够一个编码单元,我们需要根据以下规则编码最后一个不足3byte的单元

  1. 若余下1byte(8bit)数据,将其填充0到3byte(24bit),按照正常方式编码这3byte(24bit)中的前12bit得到2个base64字符,余下12bit编码为2个等号("=")

    例如

    原始数据最后余下10101010(8bit)
    将其填充为10101010 00000000 00000000(24bit)
    取前6位101010,编码为字符q
    取接下来6位100000,编码为字符g
    之后12个0编码为两个等号"=="
    即10101010(8bit)编码结果为qg==(4byte)
    

  2. 若余下2byte(16bit)数据,将其填充0到3byte(24bit),按照正常方式编码这3byte(24bit)中的前18bit得到3个base64字符,余下6bit编码为1个等号("=")

原始数据最后余下10101010 10101010(16bit)
将其填充为10101010 10101010 00000000(24bit)
取前6位101010,编码为字符q
取接下来6位101010,编码为字符q
再取接下来6位101000,编码为字符o(小写字母o)
之后6个0编码为一个等号"="
即10101010 10101010(16bit)编码结果为qqo=(4byte)

解码就是编码的逆变换,在处理最后一个单元时可以先把“=”码值视为0正常解码的到3byte数据,然后再根据“=”的个数决定最后一个单元解码结果的有效长度。

编程实现

base64编码算法的核心是移位操作,通过移位操作提取出原始数据中的高6bit,低6bit,高4bit,低4bit,高2bit,低2bit然后拼接起来得到6bit,以一个编码单位为例,以下为编码的核心部分:

编码:

char base64_encode_table[64]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
unsigned char origin_data[3];
unsigned char encode_data[4];
unsigned char tmp1,tmp2;
/*取前6bit,原始数据第一个byte右移2位得到码值,根据base64编码表得到字符*/
encode_data[0] = base64_encode_table[orgin_data[0]>>2]
/*取接下来6bit,包括第一个byte的低2bit和第二个byte的高4bit*/
tmp1 = orgin_data[0]<<6;
tmp1 = tmp1>>2;          //6bit拼起来放到一个字节的低6bit
tmp2 = origin_data[1]>>4;
encode_data[1] = base64_encode_table[tmp1+tmp2];
/*取接下来6bit,包括第二个byte的低4bit和第三个byte的高2bit*/
tmp1 = orgin_data[1]<<4;
tmp1 = tmp1>>2           //6bit拼起来放到一个字节的低6bit
tmp2 = origin_data[2]>>6;
encode_data[2] = base64_encode_table[tmp1+tmp2];
/*取最后6bit*/
tmp1 = origin_data[2]<<2;
tmp1 = tmp1>>2;
encode_data[3] = base64_encode_table[tmp1];

解码:

首先查base64编码表把编码字符恢复成码值
unsigned char encode_data[4];
unsigned char origin_data[3];
unsigned char tmp1,tmp2;
/*恢复第一个byte,包括encode_data第一个byte的低6bit和第二个byte的第3,4个bit*/
tmp1 = encode_data[0]<<2;
tmp2 = encode_data[1]>>4;
tmp2 = tmp2 <<6;
orgin_data[0] = tmp1+tpm2;
/*恢复第二个byte,包括encode_data第二个byte的低4bit和第三个byte的第3,4,5,6个bit*/
tmp1 = encode_data[1]<<4;
tmp2 = encode_data[2]>>2;
orgin_data[1] = tmp1+tpm2;
/*恢复第二个byte,包括encode_data第三个byte的低2bit和第四个byte的低6bit*/
tmp1 = encode_data[2]<<6;
tmp2 = encode_data[3];
orgin_data[2] = tmp1+tpm2;

完整的源代码在https://github.com/Janaury/c-encode.git,查看c-encode.h中的说明和c-encode.c中的源代码,此外还有一些其他编码哦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 1、Base64编码原理 下图为Base64编码索引表: 字符选用了"A-Z、a-z、0-9、+、/" 64个可打...
    M_JCs阅读 1,732评论 1 9
  • 今天突然想起了base64编码加密,然后就整理了一下,虽然用的不多,但了解多一点并无坏处~ 一、简介 是网络上使用...
    Lin_梓明阅读 2,818评论 0 2
  • Base64编码由来 Base64最早是用来解决电子邮件的传输问题。 传统的电子邮件是1982年定下技术规范的,详...
    Ashton阅读 2,554评论 0 6
  • 前言:前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二...
    博格体阅读 1,128评论 0 1
  • 文章来源:http://www.cnblogs.com/whoislcj/p/5887859.html前言:前面学...
    Wilson_PP阅读 955评论 0 4