URL安全的标准Base64编码和解码问题

标准Base64编码使用的64个字符表

Base64是什么?

Base64是一种用64个字符对任意数据进行编码,表示任意二进制数据的方法。

Base64编解码时需要注意的问题

Base64将二进制转码成可见字符方便进行HTTP传输,如果直接使用base64_encode和base64_decode方法的话,生成的字符串可能不适用URL地址。因为base64转码时会生成如:+/=等这些被URL进行转码的特殊字符,导致两方面数据不一致。
这时我们可以在发送前将+/=这些字符替换成URL不会转码的字符,接收到数据后,再将这些字符替换回去,再进行解码。

非URL安全的字符串编码:

字符串编码 :

- (NSString *)base64EncodedString:(NSString *)string;
{
   NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
   return [data base64EncodedStringWithOptions:0];
}

字符串解码:

- (NSString *)base64DecodedString:(NSString *)string
{
   NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
   return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}

URL安全的字符串编码:

字符串编码 :

- (NSString*)safeUrlBase64Encode:(NSString *)str
{   //因为Base64转码后可能包含有+,/,=这些不安全的URL字符串,所以要进行换字符
   // '+' -> '-'
   // '/' -> '_'
   // '=' -> ''
   NSString * base64Str = [self base64EncodedString:str];
   NSMutableString * safeBase64Str = [[NSMutableString alloc] initWithString:base64Str];
   safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
   safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
   safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];
   return safeBase64Str;
}

字符串解码:

- (NSString *)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
{   //将safeBase64编码中的"-","_"字符串转换成"+","/",字符串长度余4倍的位补"="
   // '-' -> '+'
   // '_' -> '/'
   // 不足4倍长度,补'='
   NSMutableString * base64Str = [[NSMutableString alloc] initWithString:safeUrlbase64Str];
   base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
   base64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
   NSInteger mod4 = base64Str.length % 4;
   if(mod4 > 0) {
       [base64Str appendString:[@"====" substringToIndex:(4-mod4)]];
   }
   return [self base64DecodedString:base64Str];
}

写在最后

如有错误,请指教!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 8,178评论 0 7
  • OC中的类分为可变和不可变。下表列出了Foundation框架中主要的可变类和不可变类: 种类 不可变类 可变类 ...
    陈_振阅读 3,567评论 0 0
  • 嘟哝嘟哝:最近接到一个任务:在客户端动态生成RSA密钥对,然后向服务器发送这个密钥对中的公钥字符串,由服务器进行公...
    TimmyR阅读 12,480评论 19 21
  • 七十岁的慕容垂为了身后的燕国谋取生存空间,决定亲自带兵出征北魏。 参合陂之战损失了七八万燕军精锐,慕容垂想来想去,...
    寒七琪阅读 4,075评论 2 4
  • 松果是楼下散步时,在草丛里捡到的。当时心里有小小的惊喜。花是自己家里盆栽的石榴花,从春天经过夏天再到秋天,一直不停...
    林逸葵阅读 4,860评论 7 18