有时候蛋疼的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问题,首先找自身代码的问题,代码是不会欺骗你的。
- 写好每一行代码,你不找它,它也会回来找你的。
相关链接:
网友评论