Base64は2進文字をHTTP伝送用の可視文字にトランスコードできますが、Base64のトランスコーディングはURLによって「+」「/」「=」などの特殊文字を生成し、両者の矛盾が生じます。 送信前にURLをトランスコードしない文字に「+」「/」「=」を置き換え、データを受け取った後にそれらを元に戻し、デコードすることができます。
PHP:
/**
* URL base64 デコード
* '-' -> '+'
* '_' -> '/'
* 弦長 %4 の余り、補数 '='
* @param不明$string
*/
公開静的関数 urlsafe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod 4 = strlen($data) % 4;
もし($mod 4) {
$data .= substr('====', $mod 4);
}
リターンbase64_decode($data);
}
/**
* URL base64 エンコード
* '+' -> '-'
* '/' -> '_'
* '=' -> ''
* @param不明$string
*/
関数 urlsafe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
$dataを返す;
}
OC:
#pragma - saveBase64エンコーディング中の文字列「-」「_」を「+」「/」とビット補数に変換し、文字列「=」の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 オリジナル: %@", base64Str);
return [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);
安全ベース64Strを返送;
}
Java:
public static 文字列 safeUrlBase64Encode(byte[] data){
文字列 encodeBase64 = new BASE64Encoder().encode(data);
文字列 safeBase64Str = encodeBase64.replace('+', '-');
safeBase64Str = safeBase64Str.replace('/', '_');
safeBase64Str = safeBase64Str.replaceAll("=", "");
安全ベース64Strを返送;
}
public static byte[] safeUrlBase64Decode(最終文字列 safeBase64Str){
文字列 base64Str = safeBase64Str.replace('-', '+');
base64Str = base64Str.replace('_', '/');
int mod4 = base64Str.length()%4;
IF(mod4 > 0){
base64Str = base64Str + "====".substring(mod4);
}
return new BASE64Decoder().decodeBuffer(base64Str);
}
Androidの場合、android.utils.Base64には以下の機能が搭載されています:
Base64.encodeToString(encrypted, Base64.URL_SAFE|Base64.NO_WRAP);
Base64.decode(data, Base64.URL_SAFE); |