我正在使用一个开放源代码的网络框架,使开发人员可以通过在Objective-C中使用Bonjour发现的服务进行通信。在Objective-C中,当sizeof(int)不是4个字节?
现在有几条线让我处于边缘状态,即使它们在我测试过的任何机器上似乎都没有造成任何问题,无论我是否运行32位我的应用程序的64位版本:
int packetLength = [rawPacketData length];
[outgoingBuffer appendBytes:&packetLength length:sizeof(int)];
[outgoingBuffer appendData:rawPacketData];
[self writeToStream];
注意,发送的第一片的信息是所述数据分组,这是相当标准的,然后将数据本身被发送的长度。什么吓到我是长度为的长度。一台机器是否会假定int是4个字节,而另一台机器是否认为int是8个字节?
如果两种尺寸在不同的机器上可能不同,会导致这种情况?它依赖于我的编译器还是最终用户的机器体系结构?最后,如果这是一个问题,我如何获取8字节的int并将其缩小到4字节以确保向后兼容? (因为我永远不需要超过4个字节来表示数据包的大小。)
我的问题的所有3个部分的一个很好的答案。 :D – 2011-03-07 14:28:58
Kristopher,会不会有一个惩罚来简单地将任何更大的类型(或者只是int)转换为int32_t?假设高位被截断是否安全?我从不期望任何数据包大小大于int32_t的最大大小,因此如果数字实际上大于int32_t,那么它在其他地方都是错误的。 – 2011-03-10 21:35:51
智能/安全的事情是在将其投射到更小的类型之前测试该数字。你可能不会期望值太大,但如果黑客可以利用这个(通过发送一个太大的数据包,或发送一个错误的数据包),那么你需要检查。 – 2011-03-11 13:59:50