Base64 原生方法 Decode 失败

2018-07-06  本文已影响37人  盲果冻

最近有小伙伴问我,它的一串 e25hbWU6IuW8gOW/gyIsdHlwZTo5MSxzb3VyY2U6NH0 使用以下代码 decode 返回 nil,但是在线上 decode 就能得到正确的结果

NSData *data = [[NSData alloc]initWithBase64EncodedString:source options:0];
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

一段代码乍看是对的,并没有什么错误,所以我们先看看 Base64 的编解码规则吧


字符 编码 字符 编码 字符 编码 字符 编码 字符 编码 字符 编码 字符 编码 字符 编码
A 0 I 8 Q 16 Y 24 g 32 o 40 w 48 4 56
B 1 J 9 R 17 Z 25 h 33 p 41 x 49 5 57
C 2 K 10 S 18 a 26 i 34 q 42 y 50 6 58
D 3 L 11 T 19 b 27 j 35 r 43 z 51 7 59
E 4 M 12 U 20 c 28 k 36 s 44 0 52 8 60
F 5 N 13 V 21 d 29 l 37 t 45 1 53 9 61
G 6 O 14 W 22 e 30 m 38 u 46 2 54 + 62
H 7 P 15 X 23 f 31 n 39 v 47 3 55 / 63
解码前字串: a           o          c 

对应ASCII: 01100001   01101111   01100011

每6位分割:  011000 010110 111101 100011 

10进制值:    24      22     61     35

Base64对应字符:Y      W      9      j

最后的 Base64 字符串:YW9j
解码前字串: a           o          c d

对应ASCII: 01100001   01101111   01100011 01100100

每6位分割:  011000 010110 111101 100011 011001 000000(4个0补足)

10进制值:     24      22     61     35       25    0

Base64对应字符:Y       W      9      j   |    Z     A    =    =  (2个=补足)

最后的 Base64 字符串:YW9jZA==
- (NSString *)base64EncodeString {
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
    return [data base64EncodedStringWithOptions:0];
}
- (NSString *)base64DecodeString {
    NSInteger dMod = self.length % 4;
    NSString *base64Str = self;
    if (dMod) {
        base64Str = [base64Str stringByAppendingString:[@"====" substringFromIndex:dMod]];
    }
    NSData *data = [[NSData alloc]initWithBase64EncodedString:base64Str options:0];
    return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}

所以朋友的
e25h bWU6 IuW8 gOW/ gyIs dHlw ZTo5 MSxz b3Vy Y2U6 NH0
补足 = 即可
e25h bWU6 IuW8 gOW/ gyIs dHlw ZTo5 MSxz b3Vy Y2U6 NH0=
其实这个了解编码规则的话就能很快跟踪解决,所以仅当作一点记录吧

上一篇 下一篇

猜你喜欢

热点阅读