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