通过NSData迭代并抓取块

use*_*233 2 objective-c nsdata

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

Rob*_*ier 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)];
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

这种方案优于滚动自己的一个优点是,您将从内部的任何优化中受益NSData,避免使用内存副本.苹果不答应这样的优化,但你可以看到他们的移动与方式dispatch_dataenumerateByteRangesUsingBlock:.事实上,你应该bytes尽可能避免(*),因为这会强制NSData创建一个连续的范围,它可能已经避免到那一点.

有关更多信息,请参阅" 二进制数据编程指南".(请注意,本指南尚未针对iOS 7进行更新,也未进行讨论enumerateByteRangesUsingBlock:.)

(*)"尽可能"在这里有点强,因为你不应该让你的代码不必要地复杂化,以避免调用bytes内存副本不会成为问题.