type
status
date
slug
summary
tags
category
icon
password
今天解密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=
- 作者:NotionNext
- 链接:https://tangly1024.com/article/Data%20%E7%94%A8%20base64%20%E8%A7%A3%E5%AF%86%E8%BF%94%E5%9B%9E%20nil%20%E7%9A%84%E5%8E%9F%E5%9B%A0
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章