我目前正在开发一个 iOS 应用程序,用于解析 libcap 格式的文件。为此,我需要实现将出现在我解析的文件中的不同协议(protocol)。我的问题是我不知道如何存储我读取的不同标题。首先,我开始使用 C 类型,例如 uint8_t、uint16_t 等,所有这些都封装到 C 结构中。
例如,这是以太网数据包的 header :
#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 和数组。所以我的以太网 header 变成了这样的东西:
#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
我想对所有 header 使用类似的格式,以简化后面的代码。
但是我是 Objective-C 的新手,所以我有很多问题。 1)可以像我上面那样使用 NSData 吗?它只包含几个字节。我感觉根本就没有优化。 2)我应该在这里使用属性还是实例变量更合适?
提前谢谢您。
最佳答案
您不一定需要为您的属性使用 NSData。 您可以使用 C 类型。 对于 C 数组,您只需要存储元素计数的 int 值。这是 C 数据结构和 C 函数中的常见做法。该计数可以是结构成员或对象中的属性。 您还可以使用 NSValue 或 NSNumber 将 C 类型装箱为可在 Objective-C 集合(如 NSArray)中使用的对象。 至于优化,首先构建它,然后确定它是否充分优化。 与脚本语言非常相似的对象往往会引入一些开销,但首先进行优化几乎总是浪费时间。 NSData 不是一个重类。 Objective-C 对象本身就是真正美化的结构。
关于objective-c - 将字节存储到正确的包装器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16360973/