将字节存储到正确的包装器中

时间:2013-05-03 14:12:51

标签: objective-c c byte

我目前正在为iOS开发一个解析libcap格式文件的应用程序。为此,我需要在我解析的文件中实现不同的协议。我的问题是我不知道如何存储我读过的不同标题。首先,我开始使用C类型,例如 uint8_t uint16_t 等,所有这些都封装到C结构中。

例如,这是以太网数据包的标头:

#define ETHER_ADDR_LEN 6
typedef struct ethernet_hdr_s {
    uint8_t mac_dst[ETHER_ADDR_LEN];
    uint8_t mac_src[ETHER_ADDR_LEN];
    uint32_t tag;
    uint16_t ethertype;
    uint32_t crc;
}   ethernet_hdr_t;

然后我意识到这不起作用,因为我将要有这么多不同大小的标题,这将是一个真正的混乱使用。然后我想到只使用uint8_t和数组。所以我的以太网标题变成了类似的东西:

#define ETHER_ADDR_LEN 6
typedef struct ethernet_hdr_s {
    uint8_t mac_dst[ETHER_ADDR_LEN];
    uint8_t mac_src[ETHER_ADDR_LEN];
    uint8_t tag[4];
    uint8_t ethertype[2];
    uint8_t crc[4];
}   ethernet_hdr_t;

但问题是关于经典的C阵列,大小未知,这不是我眼中最好的解决方案。此外,使用ARC,我不能在C结构中使用对象。

所以我想到了使用Objects。为什么在Objective C中完全编程,我喜欢这个想法。我的标题将是一个类似的类:

@interface PcapHeader : NSObject
@property (readwrite, strong) NSData *mac_dst;
@property (readwrite, strong) NSData *mac_src;
@property (readwrite, strong) NSData *tag;
@property (readwrite, strong) NSData *ethertype;
@property (readwrite, strong) NSData *crc;
@end

我想对所有标题使用类似的格式来简化稍后的代码。

但我是Objective-c的新手所以我在这里有很多问题。 1)可以像上面那样使用NSData,它只包含几个字节。我觉得它并没有优化全部。 2)我应该在这里使用属性还是实例变量更合适?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您不一定需要为您的属性使用NSData。 你可以使用C类型。 对于C数组,您只需要存储元素数的int。这是C数据结构和C函数中的常见做法。此计数可以是结构成员或对象中的属性。 您还可以使用NSValue或NSNumber将C类型封装到可以在ObjectiveA C集合(如NSArray)中使用的对象中。 至于优化,首先构建它,然后确定它是否已充分优化。 与脚本语言非常相似的对象往往会带来一些开销,但首先优化几乎总是浪费时间。 NSData不是一个沉重的类。 Objective-C对象本身就是美化结构。