在實(shí)際開(kāi)發(fā)工作中,我們進(jìn)行http數(shù)據(jù)請(qǐng)求傳輸時(shí),有時(shí)候會(huì)用到Base64的編碼格式,對(duì)參數(shù)進(jìn)行重新編發(fā).
而B(niǎo)ase64是將二進(jìn)制轉(zhuǎn)碼成可見(jiàn)字符,從而方便我們?cè)谶M(jìn)行http請(qǐng)求時(shí)進(jìn)行傳輸,但是Base64轉(zhuǎn)碼時(shí)會(huì)生成“+”,“/”,“=”符號(hào),這些是被URL進(jìn)行轉(zhuǎn)碼的特殊字符,這樣就會(huì)導(dǎo)致兩方面數(shù)據(jù)不一致,導(dǎo)致我們發(fā)送數(shù)據(jù)請(qǐng)求時(shí),無(wú)法跟后臺(tái)接口正確對(duì)接。
因此我需要在發(fā)送前將“+”,“/”,“=”替換成URL不會(huì)轉(zhuǎn)碼的字符,接收到數(shù)據(jù)后,再將這些字符替換回去,再進(jìn)行解碼。
OC中的處理方式:
#pragma - 將Base64編碼中的"-","_"字符串轉(zhuǎn)換成"+","/",字符串長(zhǎng)度余4倍的位補(bǔ)"="
+(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
{
// '-' -> '+'
// '_' -> '/'
// 不足4倍長(zhǎng)度,補(bǔ)'='
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)]];
}
NSLog(@"Base64 source str:%@", base64Str);
return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];
}
#pragma - Base64編碼中包含有"+,/,="不安全的URL字符串,我們要對(duì)這些字符進(jìn)行轉(zhuǎn)換
+(NSString*)safeUrlBase64Encode:(NSData*)data
{
// '+' -> '-'
// '/' -> '_'
// '=' -> ''
NSString * base64Str = [GTMBase64 stringByEncodingData:data];
NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str];
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];
NSLog(@"safeBase64編碼:%@", safeBase64Str);
return safeBase64Str;
}
Android中的處理方式:
//Android話,android.utils.Base64自帶該功能:
Base64.encodeToString(encrypted, Base64.URL_SAFE|Base64.NO_WRAP);
Base64.decode(data, Base64.URL_SAFE);
Java中的處理方式:
public static String safeUrlBase64Encode(byte[] data){
String encodeBase64 = new BASE64Encoder().encode(data);
String safeBase64Str = encodeBase64.replace('+', '-');
safeBase64Str = safeBase64Str.replace('/', '_');
safeBase64Str = safeBase64Str.replaceAll("=", "");
return safeBase64Str;
}
public static byte[] safeUrlBase64Decode(final String safeBase64Str){
String base64Str = safeBase64Str.replace('-', '+');
base64Str = base64Str.replace('_', '/');
int mod4 = base64Str.length()%4;
if(mod4 > 0){
base64Str = base64Str + "====".substring(mod4);
}
return new BASE64Decoder().decodeBuffer(base64Str);
}
PHP中的處理方式:
/**
* URL base64解碼
* '-' -> '+'
* '_' -> '/'
* 字符串長(zhǎng)度%4的余數(shù),補(bǔ)'='
* @param unknown $string
*/
public static function urlsafe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
/**
* URL base64編碼
* '+' -> '-'
* '/' -> '_'
* '=' -> ''
* @param unknown $string
*/
function urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}