2

有什么方法可以遍历 NSData 以便我可以根据特定的字节模式对其进行拆分?我需要将某些块分成一个数组以供以后查找。

4

1 回答 1

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创建一个连续的范围,而到目前为止它可能已经避免了。

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

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

于 2013-10-08T15:26:47.907 回答