ios - -[NSString dataUsingEncoding :] gives garbage at end of string in iOS 9, 不是 iOS 8

标签 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 = [NSString stringWithCString:(const char*)byteData encoding:NSASCIIStringEncoding];
NSLog(@"Result: %@", result);

iOS 8.4 (iPhone 6 Plus) byteDataHi there

iOS 9.0.2 (iPhone 6S) byteDataHi there\xb6<M\x13

在 iOS 9 上,我最终在字符串末尾加载了一堆垃圾。

这感觉像是 32 位与 64 位的问题,因为在 iOS 9 上字节数据长度看起来是原来的两倍?

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];

但我仍然想知道为什么我在两个 iOS 版本上得到不同的结果

NSString * result = [NSString stringWithCString:(const char*)byteData encoding:NSASCIIStringEncoding];

最佳答案

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

由于 stringWithCString:encoding: 正在读取有效内存之外的内容(寻找 NUL 终止符),因此行为未定义,因此可以随时更改。

使用 cStringUsingEncoding: 来创建 data,您将获得所需的 NUL 终止符。

关于ios - -[NSString dataUsingEncoding :] gives garbage at end of string in iOS 9, 不是 iOS 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33287801/

相关文章:

ios - 放置 UICollectionView 以创建 2x3 网格 iOS 的问题

ios - 为什么我的 Iphone 4s 中的 UISlider 位置与所有其他设备不同?

iphone - UIBarButton Tappable区域过多

objective-c - 为 OS X 实现 float 按钮 UI View 的最简单方法是什么

ios - swift2.3 中的推送 View Controller 中导航栏颜色变为黑色

java - MongoDB 复杂存储过程可以与 Java Web 服务一起使用吗

ios - 如何在 Objective-C 中的 UITextField 中每次更改后调用操作?

c - 使用 malloc 函数查找空闲内存空间

c - 使用 Malloc 钩子(Hook)

c++ - 二维动态数组程序崩溃