修复个矫情的Bug

2017-07-12  本文已影响36人  Persen

有时候蛋疼的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用户信息

解决了,嘴角瞬间泛起了微笑😄!

总结

相关链接:

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

上一篇下一篇

猜你喜欢

热点阅读