Base64是一种基于64个可打印字符来表示二进制数据的方法。是一种编码方法,有自己的编码表,所以称为Base64,是因为其使用64个字符来对任意二进制数据进行编码,同理有Base32、Base16编码。Base64编码是从二进制到字符的过程。
编码原理:
1.Base64是基于二进制进行操作的
2.将二进制流每3个字节一组(一共是3x8=24bit),划为4组,每组6个bit,高位分别用0补齐;
3.这样我们得到4个数字索引,然后查表,获得相应的4个字符,就是编码后的字符串。
4.Base64编码会把3字节的二进制数据编码为4字节的文本数据,所以长度会增加1/3。
编码原理很简单,接下来用代码分析一下:
NSString *target = @"012"; // 1
NSData *data = [target dataUsingEncoding:NSUTF8StringEncoding];//2
NSString *base64Str = [data base64EncodedStringWithOptions:0];//3
NSLog(@"%@",base64Str);
- 用字符串
012
测试编码过程及结果 - 将字符串转成字节形式
- 使用OC api 进行编码
- 输出编码后的结果是
MDEy
第2步得到的data一共3个字节24个bit位,16进制表示为{0X30,0X31,0X32}
二进制表示为 0011 0000 0011 0001 0011 0010
按照6bit一组进行截取,然后去编码表查询对应字符,结果为MDEy
,如下如:
特殊处理:
1如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节,Base64用\x00字节在末尾补足,再在编码的末尾加上1个或2个=号,表示补了多少字节,补了几个字节就加几个=号,解码的时候,会自动去掉。
2.由于=字符也可能出现在Base64编码中,但= 用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉。
去掉=后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了。
3.由于标准的Base64编码后可能出现字符+ 和 /,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和:
比如:有些平台上用的Base64 URL 是标准Base64编码的一个变种,分别用 -、 替换标准Base64编码结果中的 + 、 / ,并删除结果最后的 =