Base64 gali perkoduoti dvejetainius simbolius į matomus simbolius HTTP perdavimui, tačiau Base64 perkodavimas sugeneruos "+", "/", "=" ir kitus specialiuosius simbolius, perkoduotus URL, todėl tarp dviejų aspektų atsiras nenuoseklumas. Galime pakeisti "+", "/" ir "=" simboliais, kurie prieš siųsdami URL neperkoduoja, o gavę duomenis pakeisti šiuos simbolius atgal ir juos iššifruoti.
PHP:
/**
* URL base64 dekodavimas
* '-' -> '+'
* '_' -> '/'
* Likusi eilutės ilgio dalis %4, papildymas '='
* @param nežinomas $string
*/
viešoji statinė funkcija urlsafe_b64decode($string) {
$data = str_replace(masyvas('-','_'),masyvas('+','/'),$string);
$mod 4 = strlen($data) % 4;
jei ($mod 4) {
$data .= substr('====', $mod 4);
}
grąžinimo base64_decode($data);
}
/**
* URL base64 užkoduotas
* '+' -> '-'
* '/' -> '_'
* '=' -> ''
* @param nežinomas $string
*/
funkcija urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(masyvas('+','/','='),masyvas('-','_',''),$data);
grąžinti $data;
}
OC:
#pragma - Konvertuoti eilutes "-", "_" saveBase64 kodavimo į "+", "/", ir bitų papildymas su 4 kartus ilgio eilutė "="
+(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
{
// '-' -> '+'
// '_' -> '/'
Jei jis yra mažesnis nei 4 kartus ilgesnis, kompensuojamas "="
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 originalas: %@", base64Str);
return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];
}
#pragma - Base64 kodavimas yra +, /, = šios nesaugios URL eilutės, todėl pakeiskite simbolius
+(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(@"safeBase64encoded:%@", safeBase64Str);
grąžinti safeBase64Str;
}
Java:
public static String safeUrlBase64Encode(byte[] data){
Eilutė encodeBase64 = naujas BASE64Encoder().encode(data);
Eilutė safeBase64Str = encodeBase64.replace('+', '-');
safeBase64Str = safeBase64Str.replace('/', '_');
safeBase64Str = safeBase64Str.replaceAll("=", "");
grąžinti safeBase64Str;
}
viešasis statinis baitas[] safeUrlBase64Decode(galutinė eilutė safeBase64Str){
Eilutė base64Str = safeBase64Str.replace('-', '+');
base64Str = base64Str.replace('_', '/');
int mod4 = base64Str.length()%4;
if(mod4 > 0){
base64Str = base64Str + "====".substring(mod4);
}
grąžinti naują BASE64Decoder().decodeBuffer(base64Str);
}
"Android" sistemoje android.utils.Base64 yra ši funkcija:
Base64.encodeToString(užšifruotas, Base64.URL_SAFE| Base64.NO_WRAP);
Base64.decode(duomenys, Base64.URL_SAFE); |