2013-07-17 43 views
0

我收到一個至少包含50個字符的NSData字符流。通常,我會嘗試將其轉換爲NSString並使用subStringFromIndex:選擇器,但似乎NSString是NULL終止(糾正我,如果我錯了),我寧願跳過數據/字符串轉換。有誰知道是否有辦法在NSData的特定索引處獲取文件?例如,假設返回的數據是:NSData subStringFromIndex:等效

<12345678 9abcdefg hjiklmno> 

假設我想讓7和8出來,而只有這兩個人。爲了獲得7和8,我試圖嘗試這樣的事情:

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(7, -19)]; 

工程就像一個魅力。但問題是,這個流總是會有不同的長度。它可以是100個字符,也可以是50個,但我總是知道我需要的兩個值位於第42和第43個位置。有沒有人有一個例子或知道最好的方法來做到這一點?

回答

2

我不知道你的代碼與負長度不會崩潰。

爲了讓兩個字節位置42,43,只是用

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(42, 2)]; 
+0

非常感謝。是的,我在那裏放了一些條件來防止崩潰,但它肯定是在這些之前!再次感謝。 – John

+0

@約翰:不客氣! –

1

爲什麼你想跳過轉換的NSString?

您收到的字符串被編碼爲NSData。根據編碼,每個字符將表示爲一個或多個字節。如果是UTF8編碼,則某些字符將表示爲一個字節,而其他字符將由兩個或更多字節表示。

因爲這個原因,如果你希望你的代碼是健壯的,並且處理不同的編碼和不同的字符串內容,你應該先將你的NSData轉換成一個NSString,然後索引這個字符串。

如果字符串是UTF-8編碼,你可以做到以下幾點:

NSData *data = ... 
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSString *subString = [str substringFromIndex:... 

在我看來,它纔有意義跳過如果您收到大量的數據轉換成的NSString和您可以控制編碼以及您收到的字符串數據的內容。俗話說:不成熟的優化是萬惡之源。

+0

偉大的點人,非常感謝輸入。讓我快速地給出這個鏡頭...... – John