2012-05-06 65 views

Odpowiedz

28

Zamiast dołączania bajty do zmiennego łańcucha, utworzyć ciąg przy użyciu danych:

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

Jeśli naprawdę chcą pętli bajtów:

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

Czym powinna być linia doSomethingWithChar np. czy chcę dodać szesnastkową reprezentację bajtu do NSMutableString? – yannis

+0

co, jeśli nsdata nie jest w rzeczywistości ciągiem znaków? co się stanie, jeśli zawiera bajt 0x00, wtedy nie będzie można dokonywać iteracji przez całe dane. –

11

Update! Od wersji iOS 7 istnieje nowy, preferowany sposób na iterowanie wszystkich bajtów w obiekcie NSData.

Ze względu na to NSData mogą się składać z wielu rozłącznych kawałki tablicy bajtów pod maską, nazywając [NSData bytes] może być czasem pamięci nieefektywne, ponieważ musi spłaszczyć wszystkie kawałki leżących w jednej tablicy bajtów do rozmówcy.

Aby tego uniknąć, lepiej jest wyliczyć bajty przy użyciu metody NSData, która zwróci zakresy istniejących fragmentów bazowych, do których można uzyskać bezpośredni dostęp bez potrzeby generowania jakichkolwiek nowych struktur tablic. Oczywiście, musisz uważać, aby nie grzebać niewłaściwie w dostarczonej tablicy w stylu 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]]; 
    } 

}];