如何正确确保32位和64位兼容性?

时间:2016-11-23 15:11:20

标签: ios objective-c

关于我们几年前的32到64位步骤的更多一般性问题。

假设我们有一个应用程序可以将某些内容保存到磁盘,并且可以将其发送给其他人。它可以从32位系统发送,在64位读取,反之亦然。

如果我用

将内容写入磁盘

[NSData dataWithBytes:&thedata length:sizeof(long)];

在32位,sizeof将是4,在64位,它将是8.一旦写入磁盘,它就是“写入 - 字节”。另一方将以自己的长度阅读。

为了确保它有效,我必须将它全部投射到长度一致的基元。

我理解如果我使用NSInteger,那么所有typedef都不会是有条件的。但即使是原始人也不安全。 intfloat目前正在进行,但long确实发生了变化。我如何确保我使用STAY安全的原语?

谁知道未来会带来什么......

所以最好的战术是什么?

2 个答案:

答案 0 :(得分:2)

确保不会再次咬你的最佳方法是不要这样做。

作为非常的一般经验法则,如果POD中存在某些内容(即NSIntegerint64_tfloat,.. 。)它永远不应写入磁盘或直接打包到NSData

为您的用例提供最简单的方法可能是将NSInteger放在NSNumber中(使用NSNumber的{​​{1}}),然后坚持下去在+numberWithInteger:中,然后使用NSDictionary+dictionaryWithContentsOfURL进行读写。

如果你在-writeToURL:atomically:中绝对需要它,那么也有一个技巧:

NSData

通过这种方法,无论发送到哪个系统,您都(相对)确信您的号码能够毫发无损地存活下来。

答案 1 :(得分:-1)

每当您需要保证长度等于32位和64位系统时,您可以使用特定类型int32_tint64_t ......

如何将其转换为字节数组/ NSData可以找到here