Base64编码
什么是Base64?
Base64是网络上最常见的用于传输8bit字节码的编码方式之一。Base64就是一种基于64个可打印字符来表示二进制数据的方法。
64个可打印字符分别为:
* 10个数字:0~9
* 52个字母:a~z、A~Z
* 两个字符:+、/
注意:字符=在Base64编码中有特殊含义。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才可阅读。
Base64编码规则
- 把3个8位字节(3*8=24)转换成4个6位字节(4*6=24),之后在6位的前面补两个0,形成一个新的8位字节。
- 每76个字符加一个换行符
- 最后的结束符也要处理
新生成的8位字节最大值为0x3F(63),可通过Base64码表找到对应字符。
Base64码表如下:
[站外图片上传中...(image-ec7fb0-1618914920191)]
示例1:abc,使用Base64编码
【步骤1】得到“abc“的ASCII码
97 98 99
【步骤2】将97 98 99转成换二进制
01100001 01100010 01100011
【步骤3】三个8Bit的字节转换为四个6Bit的字节
011000 010110 001001 100011
【步骤4】通过6bit位前面被0,生成新的8位字节
00011000 00010110 00001001 00100011
【步骤5】通过Base码表查找相应字符
00011000 --> 24 --> Y
00010110 --> 22 --> W
00001001 --> 9 --> J
00100011 --> 35 --> j
因此 abc 的Base64编码后为 YWJj
示例2:Man,使用Base64编码
【步骤1】得到“Man“的ASCII码
77 97 110
【步骤2】将77 97 110转成换二进制
01001101 01100001 01101110
【步骤3】三个8Bit的字节转换为四个6Bit的字节
010011 010110 000101 101110
【步骤4】通过6bit位前面被0,生成新的8位字节
00010011 00010110 00000101 00101110
【步骤5】通过Base码表查找相应字符
00010011 --> 19 --> T
00010110 --> 22 --> W
00000101 --> 5 --> F
00101110 --> 46 --> u
因此 Man 的Base64编码后为 TWFu
示例3:A,使用Base64编码
【步骤1】得到“A“的ASCII码
65
【步骤2】将65转成换二进制
01000001
【步骤3】三个8Bit的字节转换为四个6Bit的字节
010000 010000 000000 000000
【步骤4】通过6bit位前面被0,生成新的8位字节
00010000 00010000 00000000 00000000
【步骤5】通过Base码表查找相应字符
00010000 --> 16 --> Q
00010000 --> 16 --> Q
00000000 --> 0补位 --> =
00000000 --> 0补位 --> =
因此 A 的Base64编码后为 QQ==
注意:当需要编码的字节数不为3的倍数,处理方式如下:
- 先使用
0值在末尾补齐,使总的字节数能被3整除。 - 进行Base64编码。
- 对于0补位的字节,使用
=字符
Base64终端指令
语法:
base64 [OPTION]... [FILE]
参数:
-d, --decode # 解码
-i, --ignore-garbage # 解码时,忽略非字母字符
-w, --wrap=COLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动>换行
--help # 显示此帮助说明并退出
--version # 输出版本信息并退出
示例1:
// A 的Base64编码
macbookpro@macbookde % printf A | base64
QQ==
// QQ== 的Base64解码
macbookpro@macbookdeMacBook-Pro Desktop % printf QQ== | base64 -Dd
A%
示例2:
// Man 的Base64编码
macbookpro@macbookde % printf Man | base64
TWFu
// TWFu 的Base64解码
macbookpro@macbookde % printf TWFu | base64 -Dd
Man%
Base64的代码演示
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSString* str = [self base64Endcode:@"A"];
NSLog(@"Encode : %@", str);
str = [self base64Decode:str];
NSLog(@"Decode : %@", str);
}
- (NSString*)base64Endcode:(NSString*)string{
NSData* dataEndcode = [string dataUsingEncoding:NSUTF8StringEncoding];
return [dataEndcode base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
- (NSString*)base64Decode:(NSString*)string{
NSData* dataDecode = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
return [[NSString alloc] initWithData:dataDecode encoding:NSUTF8StringEncoding];
}
//输出
2021-04-20 18:29:40.914709+0800 Demo[26465:23338472] Encode : QQ==
2021-04-20 18:29:40.914974+0800 Demo[26465:23338472] Decode : A
总结:
- Base64只是一种
编码方式不是加密方式。 - Base64适用于
表示二进制数据。 - 通过Base64编码后的数据比原数据大概长1/3。
- Base64是通过
查表的方式得到编码后的数据。













网友评论