2013-10-08 66 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