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

标签 objective-c c byte

我目前正在开发一个 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/

相关文章:

iphone - 在启动图像上隐藏状态栏

objective-c - 如何强制核心数据从模型创建 Sqlite 数据库*之前*任何数据都保存在应用程序中?

c - 无法删除结构中的确定位置,数据仍然存在

c - 先前的堆栈变量

ios - UITableViewController 静态单元格在推送到 navigationController 时不出现

iphone - 如何让两个 subview 相互交互?

c - [] 优先于 * 运算符

在C中将char数组转换为int

java - 有没有办法在java中将字节转换为 boolean 数组?

java - 如何在一个字节中展开位?