修復個矯情的Bug

有時候蛋疼的bug總是出現(xiàn)在恰當?shù)臅r候,本可以早點下班耍耍,卻被一個蛋疼的bug拽住了,想走可沒那么容易!

具體的bug代碼如下:

- (NSString *)playBackUrlWithPart:(PartInfo *)part{
    
    // 一個經過解密直播回放的url
    NSString *playback = part.playback_url;
    
    NSLog(@"playback = %@",playback);
    
    // 拼接用戶信息
    playback = [playback stringByAppendingString:@"用戶信息"];
    
    NSLog(@"playback = %@",playback);
    
    // 返回結果
    return playback;
}

是的就是一個簡單拼接String的方法,怎么會出現(xiàn)bug,讓我們Run起來看下打印信息:

2017-07-11 20:47:29.637 BugTest[12350:9597938] playback = http://view.csslcloud.net/api/view/callback?roomid=AEB2E52D3E169D989C33DC5901307461&userid=CF5928368147E4E3&liveid=19C2B5DD5BD6FB90

2017-07-11 20:47:29.637 BugTest[12350:9597938] playback = http://view.csslcloud.net/api/view/callback?roomid=AEB2E52D3E169D989C33DC5901307461&userid=CF5928368147E4E3&liveid=19C2B5DD5BD6FB90

前后打印的信息一模一樣,難道是 -stringByAppendingString:出了問題?結果我把所有的有關的NSString API都用了遍,連 NSMutableString 都用上了,然并軟!

Xcode的緩存?shift+command+option+k clean下,沒用,重啟xcode,刪除APP,run一下還是沒用,怎么可能,這難道是iOS SDK 有問題。這是什么bug,旁邊同事來了一句,你應該去找喬布斯燒個香拜一拜,說不定這個bug就沒了??!什么鬼!

我打了幾個斷點,然后把光標移動到playback變量上,好像看到了什么:\0\0\0\0\0\0\0\0\0\0\0\0\0

http://view.csslcloud.net/api/view/callback?roomid=AEB2E52D3E169D989C33DC5901307461&userid=CF5928368147E4E3&liveid=19C2B5DD5BD6FB90\0\0\0\0\0\0\0\0\0\0\0\0\0

'\0\0\0\0\0\0\0\0\0\0\0\0\0' 后面接了13個'\0',沒有被打印出來,而playback是AES 128 CBC no padding解密來的,難道是解密的問題,google了下,確實是AES加解密的問題。

AES加解密又一個愿數(shù)據(jù)不夠16個字節(jié)補齊的問題,采用pkcs7和pkcs5的加密方式,末端添加的數(shù)據(jù)可能是0x1,0x2,0x3不固定的補齊,no padding的方式則末端都是'\0'!原來如此!渣渣的我,怎么會在解密的時候忘記把末尾的'\0'去掉!

去掉String末尾的'\0'代碼如下:

/*
    method 去除decodedString末尾'\0'
    params decoded 解密后的字符串
*/

+(NSString *)processDecodedString:(NSString *)decoded{
    // empty 判斷
    if( decoded==nil || decoded.length==0 ){
        return nil;
    }
    
    // NSString 轉換成 char *
    const char *charStr = [decoded UTF8String];

    // 計算非'\0'字符的長度
    int i=0;
    while( charStr[i]!='\0' )
    {
        i++;
    }
    
    // 截取 charStr 
    NSString *result = [[NSString alloc] initWithBytes: charStr length:i encoding:NSUTF8StringEncoding];
    
    // 返回結果
    return result;
}

經過以上處理后,讓我們在run一下看下打印結果:

2017-07-11 21:17:50.162 BugTest[12350:9597938] playback = http://view.csslcloud.net/api/view/callback?roomid=AEB2E52D3E169D989C33DC5901307461&userid=CF5928368147E4E3&liveid=19C2B5DD5BD6FB90

2017-07-11 21:17:50.162 BugTest[12350:9597938] playback = http://view.csslcloud.net/api/view/callback?roomid=AEB2E52D3E169D989C33DC5901307461&userid=CF5928368147E4E3&liveid=19C2B5DD5BD6FB90用戶信息

解決了,嘴角瞬間泛起了微笑??!

總結

  • NSString 如果末尾有多個'\0',操作NSString會出問題。
  • AES解密需要把末端多余的字符去掉,不同的AES加密方式,處理也不同。
  • 遇到bug問題,首先找自身代碼的問題,代碼是不會欺騙你的。
  • 寫好每一行代碼,你不找它,它也會回來找你的。

相關鏈接:

IOS 與 PHP 通信加密,使用AES 128 CBC no padding

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容