Base64 是網絡上常見的用於傳輸8bit字節代碼的編碼方式之一,可以將二進制轉為“字符串”。在應用程序中常常需要把二進制數據編碼為適合放在URL中的形式,此時采用Base64編碼具有不可讀性,即所編碼的數據不會被人用肉眼直接看到。
然而,標准的Base64並不適合直接放在URL里傳輸,因為URL編碼器會把標准的Base64中的’/’和’+’字符變為’%XX’的形式,而這些’%’號在存入數據庫時還需要再進行轉換,因為ANSI SQL中將’%’號用作通配符。為解決此問題,可采用一種用於URL的改進Base64編碼,它不僅在末尾去掉填充的'='號,並將標准Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數據庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,並統一了數據庫、表單等處對象標識符的格式。另有一種用於正則表達式的改進Base64變種,它將“+”和“/”改成了“!”和“-”,因為“+”,“*”以及前面在IRCu中用到的“[”和“]”在正則表達式中都可能具有特殊含義。
Base64編碼本質上是一種將二進制數據轉成文本數據的方案。對於非二進制數據,是先將其轉換成二進制形式,然后每連續6比特(2的6次方=64)計算其十進制值,根據該值在上面的索引表中找到對應的字符,最終得到一個文本字符串。
編碼“Man”
標准的Base64索引表如下,另有一個輔助字符’=’用來作為后綴使用
如果要編碼的字節數不能被3整除,最后會多出1個或2個字節,那么可以使用下面的方法進行處理:先使用0字節值在末尾補足,使其能夠被3整除,然后再進行base64的編碼。在編碼后的base64文本后加上一個或兩個'='號,代表補足的字節數。也就是說,當最后剩余一個八位字節(一個byte)時,最后一個6位的base64字節塊有四位是0值,最后附加上兩個等號;如果最后剩余兩個八位字節(2個byte)時,最后一個6位的base字節塊有兩位是0值,最后附加一個等號。 參考下表:
以“迅雷下載”為例: 很多下載類網站都提供“迅雷下載”的鏈接,其地址通常是加密的迅雷專用下載地址。
其實迅雷的“專用地址”也是用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);

