Base64 peut transcoder des caractères binaires en caractères visibles pour la transmission HTTP, mais le transcodage Base64 génère des caractères « + », « / », « = » » et d’autres caractères spéciaux transcodés par l’URL, ce qui entraîne une incohérence entre les deux aspects. Nous pouvons remplacer « + », « / » et « = » » par des caractères qui ne transcodent pas les URL avant d’être envoyés, puis replacer ces caractères après avoir reçu les données et les décoder.
PHP :
/**
* Décodage URL base64
* '-' -> '+'
* '_' -> '/'
* Le reste de la longueur de la corde %4, complément '='
* @param inconnu $string
*/
fonction statique publique urlsafe_b64decode($string) {
$data = str_replace(tableau('-','_'),tableau('+','/'),$string) ;
$mod 4 = strlen($data) % 4 ;
si ($mod 4) {
$data .= sous-str('====', $mod 4) ;
}
retour base64_decode($data) ;
}
/**
* URL encodée base64
* '+' -> '-'
* '/' -> '_'
* '=' -> ''
* @param inconnu $string
*/
fonction urlsafe_b64encode($string) {
$data = base64_encode($string) ;
$data = str_replace(array('+','/','='),array('-','_','),$data) ;
retour $data ;
}
OC:
#pragma - Convertir les chaînes « - », « _ » dans l’encodage saveBase64 en « + », « / », et le complément de bits avec 4 fois la longueur de la chaîne « = »
+(NSData*)safeUrlBase64Decode :(NSString*)safeUrlbase64Str
{
// '-' -> '+'
// '_' -> '/'
Si elle est inférieure à 4 fois la longueur, compensez '='
NSMutableString * base64Str = [[NSMutableString alloc]initWithString :safeUrlbase64Str] ;
base64Str = (NSMutableString * )[base64Str stringByReplasingOccurrencesOfString :@ »- » withString :@"+"] ;
base64Str = (NSMutableString * )[base64Str stringByReplasingOccurrencesOfString :@"_ » withString :@"/"] ;
NSInteger mod4 = base64Str.length % 4 ;
if (mod4 > 0)
[base64Str appendString :[@"==== » substringToIndex :(4-mod4)]] ;
NSLog(@"Base64 original : %@ », base64Str) ;
return [GTMBase64 decodeData :[base64Str dataUsingEncoding :NSUTF8StringEncoding]] ;
}
#pragma - L’encodage Base64 contient +, /, = ces chaînes d’URL non sécurisées, donc changer les caractères
+(NSString*)safeUrlBase64Encode :(NSData*)data
{
// '+' -> '-'
// '/' -> '_'
// '=' -> ''
NSString * base64Str = [GTMBase64 stringByEncodingData :data] ;
NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString :base64Str] ;
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacementOccurrencesOfString :@"+ » withString :@ »-« ] ;
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString :@"/ » withString :@"_"] ;
safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString :@"= » withString :@""] ;
NSLog(@"safeBase64encoded :%@ », safeBase64Str) ;
retour safeBase64Str ;
}
Java :
public static String safeUrlBase64Encode(byte[] data){
String encodeBase64 = new BASE64Encoder().encode(data) ;
String safeBase64Str = encodeBase64.replace('+', '-') ;
safeBase64Str = safeBase64Str.replace('/', '_') ;
safeBase64Str = safeBase64Str.replaceAll(« = », « ») ;
retour safeBase64Str ;
}
byte statique public[] safeUrlBase64Decode(final String safeBase64Str){
String base64Str = safeBase64Str.replace('-', '+') ;
base64Str = base64Str.replace('_', '/') ;
int mod4 = base64Str.length() %4 ;
if(mod4 > 0){
base64Str = base64Str + « ==== ».sous-string(mod4) ;
}
return new BASE64Decoder().decodeBuffer(base64Str) ;
}
Pour Android, android.utils.Base64 propose cette fonctionnalité :
Base64.encodeToString(encrypted, Base64.URL_SAFE| Base64.NO_WRAP) ;
Base64.decode(data, Base64.URL_SAFE) ; |