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

来源:互联网 发布:淘宝店童装 编辑:程序博客网 时间:2024/06/15 08:58

昨晚在解析文本时用到了以下方法


NSStringEncoding encoding =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

char *buff = malloc(HeadByteSize);

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

NSString *headString = [NSStringstringWithCString:buffencoding: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 = [NSStringstringWithCString:buff encoding:encoding];



注:

  1. calloc()有内存初始化为全0的功能,而malloc没有
  2. 若不在字符串结尾处加上\0,则会解码未分配内存,由于未分配内存的值随机,所以程序运行结果也不确定

0 0