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
变成四个字节时会导致很多问题,所以你真的应该以正确的方式做事,以防止未来的变化.)