標(biāo)準(zhǔn)Base64編碼,URLSafe模式(OC,Android,Java,PHP)

在實(shí)際開發(fā)工作中,我們進(jìn)行http數(shù)據(jù)請求傳輸時,有時候會用到Base64的編碼格式,對參數(shù)進(jìn)行重新編發(fā).

而Base64是將二進(jìn)制轉(zhuǎn)碼成可見字符,從而方便我們在進(jìn)行http請求時進(jìn)行傳輸睬捶,但是Base64轉(zhuǎn)碼時會生成“+”沼沈,“/”位迂,“=”符號,這些是被URL進(jìn)行轉(zhuǎn)碼的特殊字符雀久,這樣就會導(dǎo)致兩方面數(shù)據(jù)不一致,導(dǎo)致我們發(fā)送數(shù)據(jù)請求時,無法跟后臺接口正確對接搪锣。

因此我需要在發(fā)送前將“+”调鲸,“/”碉渡,“=”替換成URL不會轉(zhuǎn)碼的字符默蚌,接收到數(shù)據(jù)后,再將這些字符替換回去漱办,再進(jìn)行解碼这刷。

OC中的處理方式:

#pragma - 將Base64編碼中的"-","_"字符串轉(zhuǎn)換成"+"娩井,"/"暇屋,字符串長度余4倍的位補(bǔ)"="
+(NSData*)safeUrlBase64Decode:(NSString*)safeUrlbase64Str
{
    // '-' -> '+'
    // '_' -> '/'
    // 不足4倍長度,補(bǔ)'='
    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 source str:%@", base64Str);
    return [GTMBase64 decodeData:[base64Str dataUsingEncoding:NSUTF8StringEncoding]];
}

#pragma - Base64編碼中包含有"+,/,="不安全的URL字符串洞辣,我們要對這些字符進(jìn)行轉(zhuǎn)換
+(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(@"safeBase64編碼:%@", safeBase64Str);
    return safeBase64Str;
}

Android中的處理方式:

//Android話咐刨,android.utils.Base64自帶該功能:
Base64.encodeToString(encrypted, Base64.URL_SAFE|Base64.NO_WRAP);
Base64.decode(data, Base64.URL_SAFE);

Java中的處理方式:

public static String safeUrlBase64Encode(byte[] data){
        String encodeBase64 = new BASE64Encoder().encode(data);
        String safeBase64Str = encodeBase64.replace('+', '-');
        safeBase64Str = safeBase64Str.replace('/', '_');
        safeBase64Str = safeBase64Str.replaceAll("=", "");
        return safeBase64Str;
}
public static byte[] safeUrlBase64Decode(final String safeBase64Str){
        String base64Str = safeBase64Str.replace('-', '+');
        base64Str = base64Str.replace('_', '/');
        int mod4 = base64Str.length()%4;
        if(mod4 > 0){
            base64Str = base64Str + "====".substring(mod4);
        }
        return new BASE64Decoder().decodeBuffer(base64Str);
}

PHP中的處理方式:

/**
     * URL base64解碼
     * '-' -> '+'
     * '_' -> '/'
     * 字符串長度%4的余數(shù),補(bǔ)'='
     * @param unknown $string
     */
    public static function urlsafe_b64decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

    /**
     * URL base64編碼
     * '+' -> '-'
     * '/' -> '_'
     * '=' -> ''
     * @param unknown $string
     */
    function urlsafe_b64encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扬霜,一起剝皮案震驚了整個濱河市定鸟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌著瓶,老刑警劉巖联予,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡沸久,警方通過查閱死者的電腦和手機(jī)季眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卷胯,“玉大人子刮,你說我怎么就攤上這事∫ふ觯” “怎么了挺峡?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卵慰。 經(jīng)常有香客問我沙郭,道長,這世上最難降的妖魔是什么裳朋? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任病线,我火速辦了婚禮,結(jié)果婚禮上鲤嫡,老公的妹妹穿的比我還像新娘送挑。我一直安慰自己,他們只是感情好暖眼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布惕耕。 她就那樣靜靜地躺著,像睡著了一般诫肠。 火紅的嫁衣襯著肌膚如雪司澎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天栋豫,我揣著相機(jī)與錄音挤安,去河邊找鬼。 笑死丧鸯,一個胖子當(dāng)著我的面吹牛蛤铜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丛肢,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼围肥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜂怎?” 一聲冷哼從身側(cè)響起穆刻,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杠步,沒想到半個月后氢伟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撰洗,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年腐芍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片试躏。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡猪勇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颠蕴,到底是詐尸還是另有隱情泣刹,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布犀被,位于F島的核電站椅您,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寡键。R本人自食惡果不足惜掀泳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望西轩。 院中可真熱鬧员舵,春花似錦、人聲如沸藕畔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽注服。三九已至韭邓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溶弟,已是汗流浹背女淑。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留可很,地道東北人诗力。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像我抠,于是被迫代替她去往敵國和親苇本。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理菜拓,服務(wù)發(fā)現(xiàn)瓣窄,斷路器,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx纳鼎?那么一定聽過它的“同行”Apache吧俺夕!Ngi...
    JokerW閱讀 32,699評論 24 1,002
  • 編碼問題一直困擾著開發(fā)人員裳凸,尤其在 Java 中更加明顯,因?yàn)?Java 是跨平臺語言劝贸,不同平臺之間編碼之間的切換...
    x360閱讀 2,481評論 1 20
  • 從三月份找實(shí)習(xí)到現(xiàn)在姨谷,面了一些公司,掛了不少映九,但最終還是拿到小米梦湘、百度、阿里件甥、京東捌议、新浪、CVTE引有、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,272評論 11 349
  • 我看窗外的風(fēng)景瓣颅,是藍(lán)天白云的心境明了,還是初秋落葉飄零的那一份不舍譬正! 我看人來人往的人群宫补,是忙碌的不知所措,還是無...
    冰檸萌閱讀 261評論 0 1