2013-10-08 35 views
2

是否有任何方式来遍历NSData,所以我可以根据特定的字节模式分割它?我需要将某些块分解成一个数组以备后续查找。迭代通过NSData和抓块

+1

'getBytes:range:'? –

+0

问题是范围是变量我需要两个字节标记之间的一切。 – user2532233

回答

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