以下代码在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);
iOS 8.4 (iPhone 6 Plus) byteData
is Hi there
iOS 9.0.2 (iPhone 6S) byteData
is Hi therexb6<Mx13
在iOS 9中,我在字符串的末尾加载了一堆垃圾。
这感觉像是32位vs 64位的问题,因为它看起来像iOS 9的byteData长度是两倍长?
苹果有他们的32位到64位的变化表:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Major64-BitChanges/Major64-BitChanges.html
data.length
是unsigned long long
。当调用malloc
时,这可能会返回不同的长度吗?上面的代码在每个版本的iOS上运行时,为data.length
返回8
。
这感觉很奇怪,我已经没有攻击它的角度了。希望有人能对这个问题有所帮助。
谢谢!
我可以使用
修复它NSString * result = [[NSString alloc] initWithBytes:byteData length:data.length encoding:NSASCIIStringEncoding];
,但我仍然想知道为什么我得到不同的结果在两个iOS版本与
NSString * result = [NSString stringWithCString:(const char*)byteData encoding:NSASCIIStringEncoding];
" C字符串"以NUL字节结尾。由于您使用dataUsingEncoding:
创建了data
,因此data
不包含C字符串。
由于stringWithCString:encoding:
正在有效内存之外读取(寻找NUL终止符),因此该行为未定义,因此允许随时更改。
使用cStringUsingEncoding:
创建data
,你会得到你需要的NUL终止符