Base64 是网络上常见的用于传输8bit字节代码的编码方式之一,可以将二进制转为“字符串”。在应用程序中常常需要把二进制数据编码为适合放在URL中的形式,此时采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准的Base64中的’/’和’+’字符变为’%XX’的形式,而这些’%’号在存入数据库时还需要再进行转换,因为ANSI SQL中将’%’号用作通配符。为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
Base64编码本质上是一种将二进制数据转成文本数据的方案。对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在上面的索引表中找到对应的字符,最终得到一个文本字符串。
编码“Man”
![](https://i-blog.csdnimg.cn/blog_migrate/c5e2a12caf018eb1130e443eff758a23.png)
标准的Base64索引表如下,另有一个辅助字符’=’用来作为后缀使用
![](https://i-blog.csdnimg.cn/blog_migrate/dfd79b982a1910633700324e5571df0f.png)
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个'='号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表:
![](https://i-blog.csdnimg.cn/blog_migrate/2cf4dd6c8ca08eb46ff87266002e91c8.png)
以“迅雷下载”为例: 很多下载类网站都提供“迅雷下载”的链接,其地址通常是加密的迅雷专用下载地址。
其实迅雷的“专用地址”也是用Base64"加密"的,其过程如下:
1、在地址的前后分别添加AA和ZZ
2、对新的字符串进行Base64编码
另:Flashget 的与迅雷类似,只不过在第一步时加的“料”不同罢了,Flashget在地址前后加的“料”是[FLASHGET]
而QQ旋风的干脆不加料,直接就对地址进行Base64编码了
方法:
- (NSString *)base64EncodedString { NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding]; return [data base64EncodedStringWithOptions:0]; } - (NSString *)base64DecodedString { NSData *data = [[NSData alloc]initWithBase64EncodedString:self options:0]; return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; }
对字符进行Base64编解码:
NSString *sourceStr = @"www.baidu.com"; NSLog(@"sourceStr---->%@",sourceStr); NSString *base64Str = [sourceStr base64EncodedString]; NSLog(@"Base64编码---->%@",base64Str); NSString *decodeStr = [base64Str base64DecodedString]; NSLog(@"Base64解码---->%@",decodeStr); /* sourceStr---->www.baidu.com Base64编码---->d3d3LmJhaWR1LmNvbQ== Base64解码---->www.baidu.com */
对图片进行Base64编解码:
// UIImage图片转成Base64字符串: UIImage *img = [UIImage imageNamed:@"0.jpg"]; NSData *imgData = UIImageJPEGRepresentation(img, 1.0f); NSString *encodedImgStr = [imgData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; NSLog(@"encodedImgStr---->%@",encodedImgStr); //Base64字符串转UIImage图片: NSData *decodedImgData = [[NSData alloc] initWithBase64EncodedString:encodedImgStr options:NSDataBase64DecodingIgnoreUnknownCharacters]; UIImage *decodedImage = [UIImage imageWithData:decodedImgData];
UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width)]; imgV.contentMode = UIViewContentModeScaleAspectFit; [imgV setImage:decodedImage]; [self.view addSubview:imgV]; NSLog(@"decodedImage---->%@",decodedImgData);