-[NSString DATAUSINGENCODE:]在iOS 9而不是iOS 8中的字符串末尾提供垃圾

-[NSString DATAUSINGENCODE:]在iOS 9而不是iOS 8中的字符串末尾提供垃圾,ios,objective-c,malloc,byte,ios9,Ios,Objective C,Malloc,Byte,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

以下代码在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
Hi-there


iOS 9.0.2(iPhone 6S)
byteData
is
Hi-there\xb6A“C字符串”以NUL字节结尾。由于您使用
datausingencode:
创建了
数据
数据
不包含C字符串

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


使用
cstringusingencode:
创建
数据
,您将获得所需的NUL终止符。

您能否共享整个代码,包括打印结果的代码?你检查过数据从不为零吗?32-/64位的除法在这里是不相关的:iOS 8和iOS 9之间没有区别,而且值取决于设备。6+和6S都是64位设备。显示如何查看
字节数据的值。您的代码在所有情况下都很好。我认为这是一个你如何看待价值的简单问题。似乎您正试图将数据视为C字符串,以防内存后面碰巧有一个空字符,而在iOS 9下则没有。但这是你看待结果的一个缺陷。对,我明白了。因此,这两个版本的iOS之间的行为发生了变化,这就是为什么我看到了不同的结果。我现在可以看出我在查看结果时做错了什么。谢谢你的澄清。
NSString * result = [[NSString alloc] initWithBytes:byteData length:data.length encoding:NSASCIIStringEncoding];
NSString * result = [NSString stringWithCString:(const char*)byteData encoding:NSASCIIStringEncoding];