美文网首页
修复个矫情的Bug

修复个矫情的Bug

作者: Persen | 来源:发表于2017-07-12 01:20 被阅读36次

    有时候蛋疼的bug总是出现在恰当的时候,本可以早点下班耍耍,却被一个蛋疼的bug拽住了,想走可没那么容易!

    具体的bug代码如下:

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

    是的就是一个简单拼接String的方法,怎么会出现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加解密又一个愿数据不够16个字节补齐的问题,采用pkcs7和pkcs5的加密方式,末端添加的数据可能是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

    相关文章

      网友评论

          本文标题:修复个矫情的Bug

          本文链接:https://www.haomeiwen.com/subject/dhzuhxtx.html