2012-05-06 27 views
7

Wie kann ich nacheinander [NSData bytes] iterieren und sie an eine NSMutableString anhängen oder sie unter Verwendung NSLog() drucken?Iterate durch NSData Bytes

Antwort

28

Anstatt Bytes auf ein veränderbares Zeichenfolge anhängt, erstellen Sie eine Zeichenfolge, die die Daten mit:

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

Wenn Sie wirklich durch die Bytes Schleife wollen:

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

Was sollte die DoSomethingWithChar-Leitung z.B. Wenn ich die hexadezimale Darstellung des Bytes zu einem NSMutableString hinzufügen möchte? – yannis

+0

Was ist, wenn das Nsdata nicht wirklich eine Zeichenkette ist? Was, wenn es 0x00 Byte enthält, dann werden Sie nicht in der Lage sein, ganze Daten zu durchlaufen. –

11

Update! Seit iOS 7 gibt es eine neue, bevorzugte Möglichkeit, alle Bytes in einem NSData-Objekt zu durchlaufen.

Da ein NSData jetzt aus mehreren disjunkten Bytearray-Chunks unter der Haube bestehen kann, kann der Aufruf [NSData bytes] manchmal speicherineffizient sein, weil es alle zugrunde liegenden Chunks in einem einzigen Bytearray für den Aufrufer abflachen muss.

Um dieses Verhalten zu vermeiden, ist es besser, Bytes mit der enumerateByteRangesUsingBlock:-Methode von NSData aufzuzählen, die Bereiche der vorhandenen zugrunde liegenden Chunks zurückgibt, auf die Sie direkt zugreifen können, ohne dass neue Arraystrukturen generiert werden müssen. Natürlich müssen Sie darauf achten, nicht unangemessen in dem bereitgestellten C-artigen Array herumzustochern.

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

}];