-[NSString dataUsingEncoding:]在iOS 9中给出字符串末尾的垃圾,而不是iOS 8



以下代码在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.lengthunsigned 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终止符

相关内容

  • 没有找到相关文章

最新更新