Base64 può trascodificare caratteri binari in caratteri visibili per la trasmissione HTTP, ma la transcodifica Base64 genera "+", "/", "=" e altri caratteri speciali transcodificati tramite URL, causando incoerenza tra i due aspetti. Possiamo sostituire "+", "/" e "=" con caratteri che non transcodificano gli URL prima di inviarli, e poi riposizionare questi caratteri dopo aver ricevuto i dati e poi decodificarli.
PHP:
/**
* Decodifica URL base64
* '-' -> '+'
* '_' -> '/'
* Il resto della lunghezza della corda %4, complemento '='
* @param sconosciuto $string
*/
funzione statica pubblica urlsafe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod 4 = strlen($data%) % 4;
se ($mod 4) {
$data .= sottostr('====', $mod 4);
}
ritorno base64_decode($data);
}
/**
* URL codificato base64
* '+' -> '-'
* '/' -> '_'
* '=' -> ''
* @param sconosciuto $string
*/
funzione urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_','),$data);
ritorno $data;
}
OC:
#pragma - Converti le stringhe "-", "_" nella codifica saveBase64 in "+", "/" e il complemento bit con 4 volte la lunghezza della stringa "="
+(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
{
// '-' -> '+'
// '_' -> '/'
Se è meno di 4 volte la lunghezza, compensa '='
NSMutableString * base64Str = [[NSMutableString alloc]initWithString:safeUrlbase64Str];
base64Str = (NSMutableString * )[base64Str stringByReplacementingOccurrencesOfString:@"-" withString:@"+"];
base64Str = (NSMutableString * )[base64Str stringByReplacementingOccurrencesOfString:@"_" withString:@"/"];
NSInteger mod4 = base64Str.length % 4;
if(mod4 > 0)
[base64Str appendString:[@"====" substringToIndex:(4-mod4)]];
NSLog(@"Base64 originale: %@", base64Str);
return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];
}
#pragma - La codifica Base64 contiene +, /, = queste stringhe URL insicure, quindi cambia i caratteri
+(NSString*)safeUrlBase64Encode:(NSData*)data
{
// '+' -> '-'
// '/' -> '_'
// '=' -> ''
NSString * base64Str = [GTMBase64 stringByEncodingData:data];
NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str];
safeBase64Str = (NSMutableString * )[safeBase64Str stringaByReplacementingOccurrencesOfString:@"+" withString:@"-"];
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacementingOccurrencesOfString:@"/" withString:@"_"];
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacementingOccurrencesOfString:@"=" withString:@""];
NSLog(@"safeBase64encoded:%@", safeBase64Str);
return safeBase64Str;
}
Java:
Public static String safeUrlBase64Encode(byte[] data){
Stringa encodeBase64 = nuovo BASE64Encoder().encode(data);
Stringa safeBase64Str = encodeBase64.replace('+', '-');
safeBase64Str = safeBase64Str.replace('/', '_');
safeBase64Str = safeBase64Str.replaceAll("=", "");
return safeBase64Str;
}
byte statico pubblico[] safeUrlBase64Decode(ultima stringa safeBase64Str){
Stringa base64Str = safeBase64Str.replace('-', '+');
base64Str = base64Str.replace('_', '/');
int mod4 = base64Str.length()%4;
if(mod4 > 0){
base64Str = base64Str + "====".substring(mod4);
}
return new BASE64Decoder().decodeBuffer(base64Str);
}
Per Android, android.utils.Base64 include questa funzione:
Base64.encodeToString(criptato, Base64.URL_SAFE| Base64.NO_WRAP);
Base64.decode(dati, Base64.URL_SAFE); |