记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,则会解码未分配内存,由于未分配内存的值随机,所以程序运行结果也不确定
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,则会解码未分配内存,由于未分配内存的值随机,所以程序运行结果也不确定
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 如何组织构建多文件 C 语言程序(二)
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 如何写好 C main 函数
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法