Jus*_*tyn 4 malloc byte objective-c ios ios9
以下代码在iOS 8上运行正常,但在iOS 9.0.2上运行时,我得到一些奇怪的结果:
NSString * input = @"Hi there";
NSData * data = [input dataUsingEncoding:NSASCIIStringEncoding];
Byte *byteData = (Byte*)malloc(data.length);
memcpy(byteData, [data bytes], data.length);
NSString * result = [NSString stringWithCString:(const char*)byteData encoding:NSASCIIStringEncoding];
NSLog(@"Result: %@", result);
Run Code Online (Sandbox Code Playgroud)
iOS 8.4(iPhone 6 Plus)byteData是Hi there
iOS 9.0.2(iPhone 6S)byteData是Hi there\xb6<M\x13
在iOS 9上,我最终在字符串的末尾加载了一堆垃圾.
这感觉就像32位vs 64位问题,因为在iOS 9上看起来像byteData长度是两倍长?
Apple在这里有32到64位的更改表:https: //developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Major64-BitChanges/Major64-BitChanges.html
data.length是一个unsigned long long.在malloc调用时,这会返回不同的长度吗?上面的代码返回8的data.length时候在iOS上的每个版本上运行.
这感觉很奇怪,我已经没有角度来攻击它了.希望那里的某人可能能够对这一点有所了解.
谢谢!
更新
我可以使用它修复它
NSString * result = [[NSString alloc] initWithBytes:byteData length:data.length encoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)
但是我仍然想知道为什么我在两个iOS版本上获得了不同的结果
NSString * result = [NSString stringWithCString:(const char*)byteData encoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)
"C字符串"以NUL字节结尾.由于您创建了data使用dataUsingEncoding:,因此data不包含C字符串.
由于stringWithCString:encoding:在有效内存之外读取(查找NUL终结符),因此行为未定义,因此允许随时更改.
使用cStringUsingEncoding:创建data,你会得到你所需要的NUL终止符.
| 归档时间: |
|
| 查看次数: |
838 次 |
| 最近记录: |