2012-05-06 64 views

回答

28

而不是附加的字節到一個可變的字符串,使用數據創建一個字符串:

// Be sure to use the right encoding: 
NSString *result = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding]; 

如果你真的通過字節要循環:

NSMutableString *result = [NSMutableString string]; 
const char *bytes = [myData bytes]; 
for (int i = 0; i < [myData length]; i++) 
{ 
    [result appendFormat:@"%02hhx", (unsigned char)bytes[i]]; 
} 
+0

doSomethingWithChar行應該是什麼,例如如果我想將字節的十六進制表示添加到NSMutableString? – yannis

+0

如果nsdata實際上不是字符串呢?如果它包含0x00字節,那麼你將無法遍歷整個數據。 –

11

更新!從iOS 7開始,有一種新的首選方法可以遍歷NSData對象中的所有字節。

因爲一個NSData現在可以在引擎蓋下由多個不相交的字節數組塊,主叫[NSData bytes]有時可以是存儲器低效的,因爲它需要所有的潛在塊壓扁成一個單一的字節數組的呼叫者。

爲避免此行爲,最好使用NSData的enumerateByteRangesUsingBlock:方法枚舉字節,該方法將返回現有底層塊的範圍,您可以直接訪問它們的範圍,而無需生成任何新的數組結構。當然,你需要小心,不要在提供的C型陣列中不恰當地四處亂撥。

NSMutableString* resultAsHexBytes = [NSMutableString string]; 

[data enumerateByteRangesUsingBlock:^(const void *bytes, 
            NSRange byteRange, 
            BOOL *stop) { 

    //To print raw byte values as hex 
    for (NSUInteger i = 0; i < byteRange.length; ++i) { 
     [resultAsHexBytes appendFormat:@"%02x", ((uint8_t*)bytes)[i]]; 
    } 

}];