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

在Objective-C中,使用stringWithCString:encoding:方法解析C字符串时,遇到解码结果不稳定的问题。问题源于未在字符串末尾手动添加''作为结束标志。通过将malloc替换为calloc,确保内存初始化为0,从而在字符串结尾添加了结束符,解决了这个问题。

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


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];



注:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值