Base64和String之间的转换
首先放上 String—>Data—->Base64—->Data—->String 的转换过程
1 | let plainStr: String = "String will be convert Data" //"String will be convert Data" |
遇到的问题
用 Base64编码的String—->Data 的时候,发现 NSData(base64Encoded:options:) 返回的是一个optional的值,原来还存在转换情况会返回nil,
以前OC的时候没注意到,Data成功的条件是 Base64字符串数据需要是4个字母的整数倍 比较好奇就查了一下
Base64的原理
根据Wiki百科Base64是对二进制数据的一个处理,和String或者图片什么的具有可读性的数据没关系,也就是说二进制数据转换成A-z和0-9之类的可以被打印出来的字符串
1 | 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 ->>>>>>>TWFu |
原理是2的6次方是64,可以表达 【26个大写字母】+【26个小写字母】+【0-9】+【2个特殊字符】= 64个字符,也就是说可以用 这64个中的其中一个代表二进制的6bit
为什么要4字节呢
因为Base64中任意一个符号代表的是6bit,而计算机最小储存单位是byte = 8bit,也就是说为了保证数据的正确性,要取6和8的最小公约数
1 | 4个Base64编码 = 4 * 6bit = 24bit = 3 * 8bit = 3byte的数据 |
所以说Base64编码的字符数一定是 4个字母 的整数位
发明这个的人是傻逼么?
根据原理我们可以发现,Base64编码后数据量会变大,用4byte的字符表达了原来3byte的数据,而且没有任何保密性可言,为什么会存在这个东西呢
为了让电子邮件可以发图片
最开始电子邮件设计的时候,是为了发文字而设计的,所以只可以发 ASCII 码, ASCII一共有128个 所以只需要 7bit 就可以表示完所有的字符
等到后来电子邮件系统升级的时候发现傻逼了,如果想发图片(代指大于7bit的数据,计算机每byte就是8bit),就要把它变成能够通过电子邮件系统发送的东西,要能用字符串(即低于7bit)来表示
所以就发明了可以把 任意文件编码成字符串 的Base64编码(二进制—->ACSII码),就可以用电子邮件来发送二进制了