0

我目前正在为 iOS 开发一个解析 libcap 格式文件的应用程序。为此,我需要实现将出现在我解析的文件中的不同协议。我的问题是我不知道如何存储我阅读的不同标题。首先,我开始使用 C 类型,例如uint8_tuint16_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 结构中使用对象。

所以我想到了使用对象。为什么要完全在 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)我应该在这里使用属性还是实例变量更合适?

先感谢您。

4

1 回答 1

0

您不一定需要为您的属性使用 NSData。您可以使用 C 类型。对于 C 数组,您只需要存储元素计数的 int 即可。这是 C 数据结构和 C 函数中的常见做法。此计数可以是结构成员或对象中的属性。您还可以使用 NSValue 或 NSNumber 将 C 类型装入对象中,这些对象可以在诸如 NSArray 之类的 Objective-C 集合中使用。至于优化,首先构建它,然后确定它是否足够优化。类似于脚本语言的对象往往会引入一些开销,但首先优化几乎总是浪费时间。NSData 不是一个重量级的课程。Objective-C 对象本身就是美化的结构。

于 2013-05-03T15:09:44.050 回答