我的代码一直在崩溃(这是一个旧的iOS应用程序,没有ARC )。这是有问题的代码:
- (NSString *) dataToHex:(NSData *)data {
NSUInteger len2 = [data length] * 2;
unsigned char* chars = (unsigned char*) [data bytes];
char finalChar[len2 + 1];
for(int i = 0; i < len2; i++) {
sprintf(finalChar + (i * 2), "%02x", chars[i]);
}
finalChar[len2] = '\0';
NSString *hexString = [NSString stringWithFormat:@"%s", finalChar];
return hexString;
}
崩溃属于sprintf()
。有任何想法吗?我尝试使用更大的缓冲区大小,但不起作用。
答案 0 :(得分:3)
看起来像这个循环:
for(int i = 0; i < len2; i++) {
应该是:
for(int i = 0; i < len; i++) {
(否则你的阅读超出了输入数据的结尾,并且超出了输出数据的结尾)。
答案 1 :(得分:3)
在您的情况下,finalChar
数组的大小为len2 + 1
。之后,在for
循环中,通过说
for(int i = 0; i < len2; i++) {
sprintf(finalChar + (i * 2), "%02x", chars[i]);
}
finalChar + (i * 2)
会在某个时刻指向超出限制的内存(当i
大于len2/2
时),因为i
不限于data length
}。超出内存访问导致undefined behavior。
我相信,它应该像
for(int i = 0; i < len2/2 ; i++) {
sprintf(finalChar + (i * 2), "%02x", chars[i]);
}