有時候蛋疼的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問題,首先找自身代碼的問題,代碼是不會欺騙你的。
- 寫好每一行代碼,你不找它,它也會回來找你的。
相關鏈接: