iOS Base64編碼(文字/圖片)


  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);

 

 

 

 
 
     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM