Data用base64解密返回nil的原因

今天解密base64数据一直返回nil
查了查解决方案发现并没有我遇到的情况,这里分享一个大多数人可能遇到的问题的答案
https://www.jianshu.com/p/5a08c772d98a

下面说我遇到的问题
例如hello的base64密文是:
aGVsbG8=
可是返回的却是
aGVsbG8
当位数不等于4的倍数的时候使用
Data(base64Encoded: base64String)就会返回nil

原因(base64编码方式):
1、有一个字符串如
hello
2、加密时会把hello转成ascii码,就是
104、101、108、108、111
3、会把ascii码转成二进制,并取8位,不足8位前边补0,就是
01101000、01100101、01101100、01101100、01101111
4、重新排版,每六位为一个字节
011010、000110、010101、101100、011011、000110、1111
可以看到最后一位01111是4位,这里我们补0
011010、000110、010101、101100、011011、000110、111100
5、根据重新编码后的二进制,每六位得出十进制
26、6、21、44、27、6、60
6、base64编码表
0-25对应A-Z
26-51对应a-z
52-61对应0-9
62对应+
63对应/
一共64位
7、根据编码表得出
26=a
6=G
21=V
44=s
27=b
6=G
60=8
结果就是aGVsbG8
8、到这里把上边的结果放进解码网站一般就都可以还原出结果hello了。
但是放进Data(base64Encoded: base64String)就会返回nil,下边说原因
编码时,第3步,我们取8个bit为一个字节,每 3 个字节一组,共 8bit*3=24bit,我们产生的结果都要是24bit的倍数。我们在第4步补完0之后,取6个bit为一个字节,一共7个字节就是42bit。比48少了6个bit。
所以最终的结果aGVsbG8是7位而不是4的倍数
这种情况根据base64编码规则,在结果后边补=就可以了。
在base64编码中,如果是一个字符加密,第3步转成8bit,也要余数2bit给第4步去补位,所以只可能补一个等号或者两个等号,而Data(base64Encoded: base64String)返回nil就是因为传入的base64String缺失了这一两个等号,我们可以在拿到base64String时去拿base64String.count % 4 == 0 做判断,看少了几个等号自己补一下。。
最终结果就是aGVsbG8=

你可能感兴趣的:(Data用base64解密返回nil的原因)