美文网首页
base64编码

base64编码

作者: aliasToHell | 来源:发表于2017-09-26 17:16 被阅读0次

简介

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中的源代码,此外还有一些其他编码哦

相关文章

  • iOS URL安全的Base64编码、解码

    参考iOS开发探索-Base64编码iOS URL编码&base64编码URL安全的Base64编码,解码 为什么...

  • BASE64 编码简析

    Base64编码: <1>·Base64编码简介: <2>·使用Base64的原因: <3>·编码原理: 成这个字...

  • SMTP整理

    账号:BASE64编码的账号 密码:BASE64编码的密码 快速BASE64编码网址: http://tools....

  • base64 和 url base64 和 encodeURIC

    1 先来看base64编码 2 再看url base64编码 可以看出,非url base64不会对斜杠进行编码。...

  • Base系列加密解密

    Base编码系列:[Base64][Base32] [Base16] [Base64] Base64编码是使用64...

  • java android 对接接口加密

    加密方式 方案1 使用Base64编码最常用的就是Base64编码了,Base64不算是加密,只是把字符经过编码变...

  • Base64

    Base64简介 Base64 原理解析 编码实现 Base64简介 命令行运行base64编码和解码 对文件操作...

  • base64编码解码原理散图

    base64编码出现原因: base64转码原理000.png base64编码原理: base64转码原理.pn...

  • 加密编码总结

    url编码 base64编码 工作中碰到url与base64配合加解密的问题,base64编码后的字符串中可能含有...

  • URL编码表 | Base64编码表

    URL编码表: Base64编码表:

网友评论

      本文标题:base64编码

      本文链接:https://www.haomeiwen.com/subject/zzxeextx.html