2012-05-06 13 views
7

मैं [NSData bytes] के माध्यम से एक-एक करके कैसे सक्रिय कर सकता हूं और उन्हें NSMutableString में जोड़ सकता हूं या NSLog() का उपयोग करके उन्हें प्रिंट कर सकता हूं?NSData बाइट्स के माध्यम से Iterate

उत्तर

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 लाइन को क्या होना चाहिए उदा। अगर मैं एक एनएसएमयूटेबलस्ट्रिंग को बाइट के हेक्साडेसिमल प्रतिनिधित्व को जोड़ना चाहता हूं? – yannis

+0

क्या होगा अगर nsdata वास्तव में एक स्ट्रिंग नहीं है? क्या होगा यदि इसमें 0x00 बाइट शामिल है, तो आप पूरे डेटा के माध्यम से पुन: सक्रिय नहीं हो पाएंगे। –

11

अद्यतन! आईओएस 7 के बाद, एनएसडीटा ऑब्जेक्ट में सभी बाइट्स के माध्यम से फिर से शुरू करने के लिए एक नया, पसंदीदा तरीका है।

एक NSData अब हुड के नीचे कई संबंध तोड़ना बाइट सरणी मात्रा से बना जा सकता है, बुला [NSData bytes] कभी कभी स्मृति-अक्षम हो सकता है, क्योंकि यह फोन करने वाले के लिए एक एकल बाइट सरणी में अंतर्निहित हिस्सा के सभी समतल की जरूरत है।

इस व्यवहार से बचने के लिए, एनएसडेटा की enumerateByteRangesUsingBlock: विधि का उपयोग करके बाइट्स को गिनना बेहतर है, जो मौजूदा अंतर्निहित हिस्सों की श्रेणियों को वापस कर देगा, जिन्हें आप बिना किसी नई सरणी संरचनाओं को उत्पन्न किए बिना सीधे पहुंच सकते हैं। बेशक, आपको सावधान रहना होगा कि प्रदान की गई सी-स्टाइल सरणी में अनुपयुक्त रूप से पोकिंग न करें।

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]]; 
    } 

}]; 
संबंधित मुद्दे