通过NSData迭代并抓取块

时间:2013-10-08 14:52:42

标签: objective-c nsdata

有没有办法迭代NSData,所以我可以根据特定的字节模式拆分它?我需要将某些块拆分成一个数组,以便以后查找。

1 个答案:

答案 0 :(得分:12)

要在某个分隔符上拆分NSData,您可以使用rangeOfData:options:range:搜索分隔符,然后使用subdataWithRange:进行拆分。例如(根据我目前正在处理的一些代码,但我没有测试过这个特定的块):

NSRange range = [data rangeOfData:delimiter
                          options:0
                            range:NSMakeRange(0, data.length)];
if (range.location != NSNotFound) {
  size_t body_offset = NSMaxRange(range);
  size_t body_size = data.length - body_offset;
  NSData *bodyData = [data subdataWithRange:NSMakeRange(body_offset, body_size)];
  ...
}

此示例搜索delimiter并在此之后为所有字节分配bodyData。您可以编写类似的代码来分解并将它们添加到数组中,或者您喜欢的任何内容。

这种方案优于滚动自己的一个优点是,您将受益于NSData内部避免内存复制的任何优化。 Apple不承诺进行此类优化,但您可以看到它们正在以dispatch_dataenumerateByteRangesUsingBlock:的方式移动。事实上,你应该尽可能避免使用bytes(*),因为这会强制NSData创建一个连续的范围,到目前为止它可能已经避免了。

有关详情,请参阅Binary Data Programming Guide。 (请注意,本指南尚未针对iOS 7进行更新,也未讨论enumerateByteRangesUsingBlock:。)

(*)“尽可能”在这里有点强,因为如果内存副本不成问题,你不应该为了避免调用bytes而使你的代码变得不必要复杂。