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

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)byteDataHi there

iOS 9.0.2(iPhone 6S)byteDataHi 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调用时,这会返回不同的长度吗?上面的代码返回8data.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)

rob*_*off 6

"C字符串"以NUL字节结尾.由于您创建了data使用dataUsingEncoding:,因此data不包含C字符串.

由于stringWithCString:encoding:在有效内存之外读取(查找NUL终结符),因此行为未定义,因此允许随时更改.

使用cStringUsingEncoding:创建data,你会得到你所需要的NUL终止符.