gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:52:10 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com