有没有办法迭代NSData,所以我可以根据特定的字节模式拆分它?我需要将某些块拆分成一个数组,以便以后查找。
答案 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_data
和enumerateByteRangesUsingBlock:
的方式移动。事实上,你应该尽可能避免使用bytes
(*),因为这会强制NSData
创建一个连续的范围,到目前为止它可能已经避免了。
有关详情,请参阅Binary Data Programming Guide。 (请注意,本指南尚未针对iOS 7进行更新,也未讨论enumerateByteRangesUsingBlock:
。)
(*)“尽可能”在这里有点强,因为如果内存副本不成问题,你不应该为了避免调用bytes
而使你的代码变得不必要复杂。