有時(shí)候蛋疼的bug總是出現(xiàn)在恰當(dāng)?shù)臅r(shí)候,本可以早點(diǎn)下班耍耍,卻被一個(gè)蛋疼的bug拽住了,想走可沒那么容易!
具體的bug代碼如下:
- (NSString *)playBackUrlWithPart:(PartInfo *)part{
// 一個(gè)經(jīng)過解密直播回放的url
NSString *playback = part.playback_url;
NSLog(@"playback = %@",playback);
// 拼接用戶信息
playback = [playback stringByAppendingString:@"用戶信息"];
NSLog(@"playback = %@",playback);
// 返回結(jié)果
return playback;
}
是的就是一個(gè)簡(jiǎn)單拼接String的方法,怎么會(huì)出現(xiàn)bug,讓我們Run起來(lái)看下打印信息:
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:出了問題?結(jié)果我把所有的有關(guān)的NSString API都用了遍,連 NSMutableString 都用上了,然并軟!
Xcode的緩存?shift+command+option+k clean下,沒用,重啟xcode,刪除APP,run一下還是沒用,怎么可能,這難道是iOS SDK 有問題。這是什么bug,旁邊同事來(lái)了一句,你應(yīng)該去找喬布斯燒個(gè)香拜一拜,說(shuō)不定這個(gè)bug就沒了??!什么鬼!
我打了幾個(gè)斷點(diǎn),然后把光標(biāo)移動(dòng)到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個(gè)'\0',沒有被打印出來(lái),而playback是AES 128 CBC no padding解密來(lái)的,難道是解密的問題,google了下,確實(shí)是AES加解密的問題。
AES加解密又一個(gè)愿數(shù)據(jù)不夠16個(gè)字節(jié)補(bǔ)齊的問題,采用pkcs7和pkcs5的加密方式,末端添加的數(shù)據(jù)可能是0x1,0x2,0x3不固定的補(bǔ)齊,no padding的方式則末端都是'\0'!原來(lái)如此!渣渣的我,怎么會(huì)在解密的時(shí)候忘記把末尾的'\0'去掉!
去掉String末尾的'\0'代碼如下:
/*
method 去除decodedString末尾'\0'
params decoded 解密后的字符串
*/
+(NSString *)processDecodedString:(NSString *)decoded{
// empty 判斷
if( decoded==nil || decoded.length==0 ){
return nil;
}
// NSString 轉(zhuǎn)換成 char *
const char *charStr = [decoded UTF8String];
// 計(jì)算非'\0'字符的長(zhǎng)度
int i=0;
while( charStr[i]!='\0' )
{
i++;
}
// 截取 charStr
NSString *result = [[NSString alloc] initWithBytes: charStr length:i encoding:NSUTF8StringEncoding];
// 返回結(jié)果
return result;
}
經(jīng)過以上處理后,讓我們?cè)趓un一下看下打印結(jié)果:
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用戶信息
解決了,嘴角瞬間泛起了微笑??!
總結(jié)
- NSString 如果末尾有多個(gè)'\0',操作NSString會(huì)出問題。
- AES解密需要把末端多余的字符去掉,不同的AES加密方式,處理也不同。
- 遇到bug問題,首先找自身代碼的問題,代碼是不會(huì)欺騙你的。
- 寫好每一行代碼,你不找它,它也會(huì)回來(lái)找你的。
相關(guān)鏈接: