iphone - 什么时候 sizeof(int) 在 Objective-C 中不是 4 个字节?

标签 iphone objective-c cocoa macos networking

我正在使用一个开源网络框架,它使开发人员可以轻松地通过在 Objective-C 中使用 Bonjour 找到的服务进行通信。

有几行让我紧张了一段时间,尽管它们似乎从未在我测试过的任何机器上造成任何问题,无论我运行的是 64 位还是 32 位- 我的应用程序的位版本:

int packetLength = [rawPacketData length];
[outgoingBuffer appendBytes:&packetLength length:sizeof(int)];
[outgoingBuffer appendData:rawPacketData];
[self writeToStream];

请注意,发送的第一条信息是数据包的长度,这是非常标准的,然后发送数据本身。让我害怕的是长度的长度。一台机器会假设一个 int 是 4 个字节,而另一台机器认为一个 int 是 8 个字节吗?

如果这两种尺寸在不同的机器上可能不同,会是什么原因造成的?它取决于我的编译器,还是最终用户的机器架构?最后,如果这是一个问题,我如何获取一个 8 字节的 int 并将其缩减为 4 字节以确保向后兼容? (因为我永远不需要超过 4 个字节来表示数据包的大小。)

最佳答案

你不能假设 sizeof(int)永远是四个字节。如果大小很重要,您应该将大小硬编码为 4(并编写代码以将值序列化为具有适当字节顺序的四字节数组),或者使用类似 int32_t 的类型。在 <stdint.h> 中定义.

(但是,作为实际问题,大多数编译器供应商已决定 int 应保留四个字节,因此您可能不必担心明天一切都会崩溃。话又说回来,它不久前,许多编译器供应商让 int 成为两个字节,当 ints 成为四个字节时会导致许多问题,所以你真的应该以正确的方式做事,以防止将来发生变化。)

关于iphone - 什么时候 sizeof(int) 在 Objective-C 中不是 4 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5220683/

相关文章:

ios - 在某些 Controller 中禁用横向时,横向启动应用程序会扭曲整个应用程序

ios - 在 iPhone 4 英寸屏幕中,它在模拟器中显示 3.5 英寸屏幕。请检查屏幕截图。可能是什么问题?

iphone - 核心数据的单例线程安全吗?

iphone - 在 dealloc 中调用 super 是否重要?

ios - 如何判断 UIImage 是彩色还是单色?

iphone - 如何解决 NSNumberFormatter 2,147,483,647 问题

objective-c - AVPlayer 不在文档目录 iOS 中播放 MP3 音频文件

ios - ALAssetsLibrary addAssetsGroupAlbumWithName 不适用于 iOS 9

iphone - dispatch_async 被触发 10 次

iphone - NSOperationQueue 在 iPhone 上不重用线程