您的位置:首页 > 移动开发 > Objective-C

记Objective-C解码C字符串遇到的坑

2015-12-23 16:54 495 查看
昨晚在解析文本时用到了以下方法

NSStringEncoding encoding =
CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

char *buff = malloc(HeadByteSize);

[micapsData getBytes:buff range:NSMakeRange(0, HeadByteSize)];

NSString *headString = [NSString
stringWithCString:buff
encoding:encoding];

然而在多次运行程序中headString有时结果正确,有时候却是nil;或者在语句前加断点时解码正确,而去掉断点得到nil。。。

自以为遇到灵异事件的第二天,突然想起C字符串是以\0作为结束的标志,而stringWithCString: encoding:方法并没有让使用者指定String的长度,所以需要在字符串的结尾处手动加上\0。即给以上代码中的buff的后一个字节变为0。

NSStringEncoding encoding =
CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

char *buff = calloc(HeadByteSize +
1, sizeof(char));

[micapsData getBytes:buff
range:NSMakeRange(0,
HeadByteSize)];

NSString *headString = [NSString
stringWithCString:buff
encoding:encoding];

注:

calloc()有内存初始化为全0的功能,而malloc没有
若不在字符串结尾处加上\0,则会解码未分配内存,由于未分配内存的值随机,所以程序运行结果也不确定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息