在开发中遇到这样一个问题,由于后端那边为了做匹配,在解出data时,会出现后面有...的情况

如果使用
NSString *ss = [[NSString alloc] initWithData:decodeData encoding:NSUTF8StringEncoding];
会导致整个NSString产生异常,length不能正常计算
而改成
NSString *resultStr = [[NSString alloc] initWithCString:decodeData.bytes encoding:NSUTF8StringEncoding];
所以
对于NSData转NSString,请使用initWithUTF8String或者initWithCString来代替initWithData,主要原因如果data内容中包含结束符\0不在最后时,会导致整个NSString产生异常,length不能正常计算。JSON、正则之类的操作无法进行。
-----------------------续----------------------------------
关于NSString的initWithCString里面有一个坑各个大大请注意一下,就是如果你传进去的bytes最后是没有带结束符的话,有可能创建的字符串是有问题的(不是必现,要看分配内存的地址)。
举个栗子:
上面的字符串叫A字符串,并且它的地址是从0x000010 - 0x000018,那么如果这一段内存地址后面紧跟着另外一个字符串B,内存地址是0x000019 - 0x00001F,此时B字符串最后是带结束符的,那么可能会出现当你要计算字符串A的长度的时候,内存寻址就直接从0x000010到0x00001F了,因为这中间并没有结束符,这样A字符串的长度就不对了。
如果不理解可以看下[https://blog.csdn.net/zhongxiaoming1991/article/details/9903387]
所以在调用这个方法之前,最好先做一步就是在最后附加一个结束符,so提供下面两种方法:
方法一:
NSMutableData *data = [NSMutableData dataWithBytes:jsonData.bytes length:jsonData.length + 1];
[data resetBytesInRange:NSMakeRange(jsonData.length, 1)];
NSString *str = [[NSString alloc] initWithCString:data.bytes encoding:NSUTF8StringEncoding];
方法二:
char termChar[1] = {'\0'};
NSMutableData *data = [NSMutableData dataWithBytes:jsonData.bytes length:jsonData.length];
[data appendBytes:termChar length:1];
NSString *str = [[NSString alloc] initWithCString:data.bytes encoding:NSUTF8StringEncoding];
网友评论