重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Base64是一种用64个字符来表示任意二进制数据的方法。 是一种编码方法,有自己的编码表 ,所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32、Base16编码。
成都创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为普兰店企业提供专业的成都做网站、网站制作,普兰店网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
用记事本打开 exe 、 jpg 、 pdf 这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符( ASCII表中有32个非打印控制字符 ),所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。
应用:
Base64的原理很简单,首先,准备一个包含64个字符的数组:
然后,对二进制数据进行处理,每3个字节一组,一共是 3x8=24 bit,划为4组,每组正好6个bit:
这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。
所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
Base64是一种任意二进制到文本字符串的编码方法,适用于小段内容的编码,常用于在URL、Cookie、网页中传输少量二进制数据(如数字证书签名、Cookie的内容等)。
与UTF在使用上有明显的不同,要在多语言环境中通用,那就是要使用UTF,这可以理解为存储数据格式。用了UTF是让大家都能识别数据,不然就会乱码。
Base-64的话,不是底层存储格式,只是为了数据交换用。比如图片变成字符格式,这是一种应用格式
原文链接: 廖雪峰的官方网站 ,本文增加了一些个人理解及iOS相关API
Base64编码是一种数据编码方式,目的是让数据符合传输协议的要求。能够将任何二进制数据,转换成只有64 +1(“=”等号)个字符组成的文本文件。
提示:Base64不是加密算法,只是一种编码算法,对数据内容进行编码不以明文来传输。
标准Base64编码使用的64个字符:
早期的传输协议,如邮件传输SMTP协议,只能传输ASCII编码中 可打印字符 ,导致原本8bit字节码(0-255)超出了可用范围。所以Base64将原本ASCII码的控制字符甚至是ASCII编码之外的字符都转换成可打印的6bit字符。
提示:ASCII编码的范围是0-127,其中0-31和127位共33个字符属于 控制字符 ,剩下的32-126属于 可打印字符 。
编码过程:
1、按字符串长度,以每3个8bit的字符为一组
2、对每组获取每个字符的ASCII编码(去ASCII编码表找每个字符的码位)
3、将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节
4、再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节
5、将这4个8bit的字节转换成10进制,对照Base64编码表 (下表),得到对应编码后的字符。
注意:
示例:对 Hello! 进行Base64编码,按照ASCII表,其转换过程如下图所示:
Hello! 的Base64编码结果为 SGVsbG8h 。
原始字符串长度为6个字符,编码后长度为8个字符,每3个原始字符经Base64编码成4个字符,编码前后长度比4/3。
这个长度比很重要 。比原始字符串长度短,则需要使用更大的编码字符集,长度比越大,则需要传输越多的字符,传输时间越长。
注意:Base64编码是每3个原始字符编码成4个字符,如果原始字符串长度不能被3整除,那怎么办?使用0值来补充原始字符串。
示例:对 Hello!! 进行Base64编码:
注:图中蓝色背景的二进制0值是额外补充的。
Hello!! 的Base64编码的结果为 SGVsbG8hIQAA 。
最后2个零值只是为了Base64编码而补充的,在原始字符中并没有对应的字符,那么Base64编码结果中的最后两个字符 AA 实际不带有效信息,所以需要特殊处理,以免解码错误。
标准Base64编码通常用 = 字符来替换最后的 A,即编码结果为 SGVsbG8hIQ==。
因为 = 字符并不在Base64编码索引表中,其意义在于结束符号,在Base64解码时遇到 = 时即可知道一个Base64编码字符串结束。
如果Base64编码字符串不会相互拼接再传输,那么最后的 = 可以省略,解码时如果发现Base64编码字符串长度不能被4整除,则先补充 = 字符,再解码即可。
解码是对编码的逆向操作,但注意一点:对于最后的两个 = 字符,转换成两个 A 字符,再转成对应的两个6比特二进制0值,接着转成原始字符之前,需要将最后的两个6比特二进制0值丢弃,因为它们实际上不携带有效信息。
UTF-8是Unicode字符集的编码规则,用于网络传输。
Base64是用来支持某些只支持传输ASCII编码可打印字符的协议,将ASCII编码中的控制字符与ASCII之外的字符转换为ASCII可打印字符来用于传输。
漫画:什么是 Base64 算法?
iOS开发探索-Base64编码
关于base64编码的原理及实现
ASCII码对照表
1、由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。
Base64编码使用和urlencode比较
base64:
1、包含A-Z a-z 0-9 和加号“+”,斜杠“/” 用来作为开始的64个数字. 等号“=”用来作为后缀用途。
2、2进制的.
3、要比源数据多33%。
4、常用于邮件。
urlencode:将除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)
请求参数传输使用base64,而不是使用urlencode,为什么?
1、部分因为base64编码后参数就不可读,而url编码英文部分是不变的
2、为了兼容网络上的一些很古老的设备, 这些古董设备只能识别 base64编码的字符
3、因为 urlencode 对二进制数据的效率不高,base64 会有效降低 %xx 的出现次数。
注释 :
1、url请求中,只对参数进行base64编码,不是对整个url进行base64编码。
2、在url请求时,会对url整体进行urlencode编码。
NSString *str = @"hello world"; NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; NSData *base64Data = [data base64EncodedDataWithOptions:0];
NSString *path = @"/Users/apple/Desktop/1.png"; NSData *data = [NSData dataWithContentsOfFile:path]; NSData *base64Data = [data base64EncodedDataWithOptions:0]; [base64Data writeToFile:@"/Users/apple/Desktop/base64" atomically:YES];
NSString *base64Str = [data base64EncodedStringWithOptions:0]; NSLog(@"base64Str: %@",base64Str); NSLog(@"%@ %ld base64Data: %@ %ld",data,data.length,base64Data,base64Data.length);
NSData *endata = [[NSData alloc] initWithBase64EncodedData:base64Data options:0]; [endata writeToFile:@"/Users/apple/Desktop/123.png2" atomically:YES]; UIImage *image = [UIImage imageWithData:endata]; NSLog(@"%@",image);
和MD5一样我们采取封装的办法将base64封装进了MySecurities这个类中
MySecurities.h 文件
#import Foundation/Foundation.h @interface MySecurities : NSObject +(NSString *)base64EncodingWithData:(NSData *)sourceData;//base64加密 +(id)base64EncodingWithString:(NSString *)sourceString;//base64解密 @end
base64加密
@implementation MySecurities +(NSString *)base64EncodingWithData:(NSData *)sourceData{ if (!sourceData) { //如果sourceData则返回nil,不进行加密。 return nil; } NSString *resultString = [sourceData base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength]; return resultString; } ***base64解密*** +(id)base64EncodingWithString:(NSString *)sourceString{ if (!sourceString) { return nil;//如果sourceString则返回nil,不进行解密。 } NSData *resultData = [[NSData alloc]initWithBase64EncodedString:sourceString options:NSDataBase64DecodingIgnoreUnknownCharacters]; return resultData; } @end