2011-03-07 41 views
5

我正在使用一个开放源代码的网络框架,使开发人员可以通过在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个字节来表示数据包的大小。)

回答

14

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

(然而,作为一个实际问题,大多数编译器厂商已经决定int应该留四个字节,所以你可能不必担心打破一切明天再说,这是不是很久以前许多编译开发商让一个int是两个字节,导致许多问题,当ints成为四个字节,所以你真的应该做的事情对未来的变化,从而以正确的方式后卫。)

+0

我的问题的所有3个部分的一个很好的答案。 :D – 2011-03-07 14:28:58

+0

Kristopher,会不会有一个惩罚来简单地将任何更大的类型(或者只是int)转换为int32_t?假设高位被截断是否安全?我从不期望任何数据包大小大于int32_t的最大大小,因此如果数字实际上大于int32_t,那么它在其他地方都是错误的。 – 2011-03-10 21:35:51

+0

智能/安全的事情是在将其投射到更小的类型之前测试该数字。你可能不会期望值太大,但如果黑客可以利用这个(通过发送一个太大的数据包,或发送一个错误的数据包),那么你需要检查。 – 2011-03-11 13:59:50

1

这可能是不同的,但是这取决于在编译器上比机器多。不同的编译器可能会重新声明int为8个字节。

0

我以为只有long在32位或64位系统的大小不同?

0

int的大小取决于机器结构; int的大小几乎总是数据总线的大小,除非你的C编译器做了一些特别的改变。

这意味着当您在8位,16位或64位机器/体系结构中编译程序时,int的大小不是4个字节。

我会为缓冲区大小而不是使用int大小定义一个常量。

希望这回答你的问题。

+0

我不确定这一点。当我编译/运行我的应用程序为32位或64位时,sizeof(int)在两种情况下都是4。 – 2011-03-07 14:43:54

+0

C标准只规定sizeof(int)至少为2.它应该是机器体系结构中整数的最“自然”大小,但编译器实现者可以选择他们想要的任何大小。 – 2011-03-07 14:51:57

+0

@craig由于您当前的机器是32位机器,Apple A4处理器,对吧? – 2011-03-07 14:54:22

相关问题