Το Base64 μπορεί να μετατρέψει δυαδικούς χαρακτήρες σε ορατούς χαρακτήρες για μετάδοση HTTP, αλλά η διακωδικοποίηση Base64 θα δημιουργήσει "+", "/", "=" και άλλους ειδικούς χαρακτήρες που διακωδικοποιούνται από τη διεύθυνση URL, με αποτέλεσμα την ασυνέπεια μεταξύ των δύο πτυχών. Μπορούμε να αντικαταστήσουμε τα "+", "/" και "=" με χαρακτήρες που δεν διακωδικοποιούν διευθύνσεις URL πριν από την αποστολή και, στη συνέχεια, να αντικαταστήσουμε αυτούς τους χαρακτήρες μετά τη λήψη των δεδομένων και στη συνέχεια να τους αποκωδικοποιήσουμε.
Η PHP:
/**
* Αποκωδικοποίηση URL base64
* '-' -> '+'
* '_' -> '/'
* Το υπόλοιπο μήκος συμβολοσειράς %4, συμπλήρωμα '='
* @param άγνωστο $string
*/
δημόσια στατική συνάρτηση urlsafe_b64decode($string) {
$data = str_replace(πίνακας('-','_'),πίνακας('+','/'),$string);
$mod 4 = strlen($data) % 4;
αν ($mod 4) {
$data .= substr('====', $mod 4);
}
επιστροφή base64_decode($data)·
}
/**
* Κωδικοποιημένη βάση URL 64
* '+' -> '-'
* '/' -> '_'
* '=' -> ''
* @param άγνωστο $string
*/
συνάρτηση urlsafe_b64encode($string) {
$data = base64_encode($string)·
$data = str_replace(πίνακας('+','/','='),πίνακας('-','_',''),$data);
επιστροφή $data?
}
OC:
#pragma - Μετατρέψτε τις συμβολοσειρές "-", "_" στην κωδικοποίηση saveBase64 σε "+", "/" και το συμπλήρωμα bit με 4 φορές το μήκος της συμβολοσειράς "="
+(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
{
// '-' -> '+'
// '_' -> '/'
Εάν είναι μικρότερο από 4 φορές το μήκος, συμπληρώστε το '='
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 original: %@", base64Str);
επιστροφή [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];
}
#pragma - Η κωδικοποίηση Base64 περιέχει +, /, = αυτές τις μη ασφαλείς συμβολοσειρές URL, επομένως αλλάξτε χαρακτήρες
+(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);
επιστροφή safeBase64Str;
}
Ιάβα:
δημόσια στατική συμβολοσειρά safeUrlBase64Encode(byte[] δεδομένα){
Συμβολοσειρά encodeBase64 = νέο BASE64Encoder().encode(data);
Συμβολοσειρά safeBase64Str = encodeBase64.replace('+', '-');
safeBase64Str = safeBase64Str.replace('/', '_');
safeBase64Str = safeBase64Str.replaceAll("=", "");
επιστροφή safeBase64Str;
}
δημόσιο στατικό byte[] safeUrlBase64Decode(τελική συμβολοσειρά safeBase64Str){
Βάση συμβολοσειράς64Str = safeBase64Str.replace('-', '+');
base64Str = base64Str.replace('_', '/');
int mod4 = base64Str.length()%4;
if(mod4 > 0){
base64Str = βάση64Str + "====".substring(mod4);
}
επιστροφή νέου BASE64Decoder().decodeBuffer(base64Str);
}
Για Android, το android.utils.Base64 διαθέτει αυτήν τη δυνατότητα:
Base64.encodeToString(κρυπτογραφημένο, Base64.URL_SAFE| Base64.NO_WRAP);
Base64.decode(δεδομένα, Base64.URL_SAFE); |