gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:27:37 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com