前言
最近在做项目的时候用到了 base64 编码,后面发现对这个东西一点都不了解,所以就查阅了下资料,这里做一个记录
Base64
之所以称为Base64编码是因为它使用了64个字符来对任意的数据进行编码,下面就是Base64的一个编码表
Base64将一个8bit的字节序列拆位一个6位的片段,并且每个6位片段都能在上面的表中找到对应的表示字符,为什么一个6位片段就能够完整的表示正规的8个bit呢?8和6的最小公倍数 是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit的不足,下面我们来个例子就能够更好的理解其中的原理,我们以Man这个字符串为例,我们来看看其转换后的Base64编码是什么样子的
文本 | M | a | n |
---|---|---|---|
ASCII编码 | 77 | 97 | 110 |
二进制位 | 01001101 | 01100001 | 01101110 |
对应的我们将二进制的8位化成6位为一个字节十进制数,并且找到其对应的Base64编码
划为6位的二进制 | 010011 | 010110 | 000101 | 101110 |
---|---|---|---|---|
十进制 | 19 | 22 | 5 | 46 |
Base64 | T | W | F | U |
通过上面我们可以得出Man的base64编码后的结果为TWFU,如果只有一个字节的字符的话就像下面这样
文本 | A |
---|---|
二进制位 | 01000001 |
划为6位的二进制 | 010000 | 010000 | 000000 | 000000 |
---|---|---|---|---|
Base64 | Q | Q | = | = |
我们可以得出一个规律,一个字符都是三个字节,三个字节的去转换的,如果不够三个字节后面就用0替代,其对应的Base64编码为=,所以我们在常规的Base64编码发现最多不会超过两个=,并且=也不会出现在编码中间,都是出现在结尾部分。
通常我们在开发中会遇到一些字符串的转化,便可以通过以下方式来进行
// 普通字符串 -> base64
NSString *man = @"Man";
NSString *base64String = [[man dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];
// base64 -> 普通字符串
NSData *normalData = [NSData alloc] initWithBase64EncodedString:base64String options:0];
NSString *normalString = [NSString alloc] initWithData:normalData encoding:NSUTF8StringEncoding];
结束
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。
以上