Objective-C中的const char数组具有不同的值,具体取决于设备

时间:2016-10-06 06:27:37

标签: ios objective-c arrays char decode

在我们正在处理的应用程序中,有一个我们想保密的文字字符串,所以我们在源代码中将它作为<span>keyword</span>\s*<title>数组引用:

<span>keyword</span><strong>

(我改变了这一点,所以它与我们的秘密不相符:))

我们使用const charconst char secret[] = { 0x63, 0x35, 0x4d, 0x58, 0x52, 0x32, 0x2c, 0x52, 0x53, 0x12, 0x3c, 0x74, 0x51, 0x53, 0x 69, 0x8a, 0x64, 0x12, 0x7f, 0x6e, 0x25, 0x64, 0x4e, 0x32, 0x23, 0x53, 0x12, 0x7b, 0x4c, 0x87, 0x64, 0x23, 0x41, 0x23, 0x56, 0x34, 0x6c, 0x23, 0x75, 0x5e, 0x56, 0x23, 0x65, 0x5b, 0x23, 0x75, 0x12, 0x65, 0x23, 0x76, 0x3a, 0x2f, 0x53, 0x32a, 0x23, 0x54, 0x54, 0x21, 0x64, 0x32, 0x53, 0x13, 0x24, 0x32 }; 转换为-[NSData dataWithBytes:length:],然后基础64解码它并secret

问题是,在iPhone 5&amp; 4s将解码数据转换为字符串失败。 在检查调试器中NSData的内容时,会有比应有的字符更多的字符。

最后,将完全相同的文字复制到另一个-[NSString initWithData:encoding:]并连续打印会产生不同的结果。

发生了什么事?

1 个答案:

答案 0 :(得分:0)

似乎有问题的设备正在读取数组的末尾,直到它们遇到某种终止字符。要阻止这种情况发生,您需要将数组中的最后一个字符作为换行符。

$ echo -en "\n" | xxd -pu

向我们显示\n作为十六进制是0a,因此添加0x0A作为secret数组文字中的最后一个元素将阻止操作系统读取随机内存。您还可以确保最终的NSString不包含换行符:)

更新

以上修复了 Debug 版本的所有问题,但在 Release 版本上发生了同样的问题,因此我们将0x0a替换为0x0并且两个版本都开始工作了