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

Cra*_*tis 5 iphone macos networking cocoa objective-c

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

现在有几行让我处于边缘状态,即使他们似乎从来没有在我测试的任何机器上造成任何问题,无论我是否运行32位64位版本我的申请:

int packetLength = [rawPacketData length];
[outgoingBuffer appendBytes:&packetLength length:sizeof(int)];
[outgoingBuffer appendData:rawPacketData];
[self writeToStream];
Run Code Online (Sandbox Code Playgroud)

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

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

Kri*_*son 15

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

(但是,实际上,大多数编译器供应商已经决定int应该保留四个字节,所以你可能不需要担心明天的一切都会破坏.然后,不久之前,很多编译器供应商都让它int成为了两个字节,当ints变成四个字节时会导致很多问题,所以你真的应该以正确的方式做事,以防止未来的变化.)