在我们正在处理的应用程序中,有一个我们想保密的文字字符串,所以我们在源代码中将它作为<span>keyword</span>\s*<title>
数组引用:
<span>keyword</span><strong>
(我改变了这一点,所以它与我们的秘密不相符:))
我们使用const char
将const 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:]
并连续打印会产生不同的结果。
发生了什么事?
答案 0 :(得分:0)
似乎有问题的设备正在读取数组的末尾,直到它们遇到某种终止字符。要阻止这种情况发生,您需要将数组中的最后一个字符作为换行符。
$ echo -en "\n" | xxd -pu
向我们显示\n
作为十六进制是0a
,因此添加0x0A
作为secret
数组文字中的最后一个元素将阻止操作系统读取随机内存。您还可以确保最终的NSString
不包含换行符:)
以上修复了 Debug 版本的所有问题,但在 Release 版本上发生了同样的问题,因此我们将0x0a
替换为0x0
并且两个版本都开始工作了