base64编码
该编码使用64个明文来编码任意的二进制文件,它里面只使用了
A-Z, a-z, 0-9, +, /
这64个字符。(编码里面的“=”是填充字符)base64编码使加密算法更加简洁高效。
算法详解
Base64编码要求把3个8位(bit)即1字节(byte)转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式。
base64编码表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
示例
16进制的data:62706c
转化为二进制: 01100010 01110000 01101100
分成4*6并加0: 011000 100111 000001 101100
根据base64编码表转化为字符:YnBs
base64EncodedString
随着iOS7正式版推出,Apple增加了使用Base64编解码的支持。
下面使用base64编码让数据在NSData和NSString之间转化
NSData *data = [@"Base64 encode test" dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64Encoded = [data base64EncodedStringWithOptions:0];
NSLog(@"Encoded: %@", base64Encoded);
NSData *dataFromBase64String = [[NSData alloc]
initWithBase64EncodedString:base64Encoded options:0];
NSString *base64Decoded = [[NSString alloc]
initWithData:dataFromBase64String encoding:NSUTF8StringEncoding];
NSLog(@"Decoded: %@", base64Decoded);
控制台输出:
Encoded: QmFzZTY0IGVuY29kZSB0ZXN0
Decoded: Base64 encode test
NSKeyedArchiver
KeyedArchiver能够保存这些类型的对象:NSArray, NSDictionary, NSDate, NSNumber, NSString, and NSData.
如果上面的那些类型不能满足要求,则可以通过使用Protocol
NSCoding
来自定义自己的对象,要实现一下协议方法:
(void)encodeWithCoder:(NSCoder *)aCoder;
(nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
归档、解归档对象
Object *encodeObj = [[Object alloc] init];
//归档,归档之后还可以对数据进行加密处理
//API Reference对返回值data描述:An NSData object containing the encoded form of
//the object graph whose root object is rootObject. The format of the archive
//is NSPropertyListBinaryFormat_v1_0.
//NSKeyedArchiver的返回值为属性为NSPropertyListBinaryFormat_v1_0的二进制格式。
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:encodeObj];
NSString *str = [data base64EncodedStringWithOptions:0];
//进行存档等操作
//...
//解归档
data = [[NSData alloc] initWithBase64EncodedString:str options:0];
Object *decodedObj = [NSKeyedUnarchiver unarchiveObjectWithData:data];