Jak mogę iterować przez [NSData bytes]
jeden po drugim i dołączyć je do NSMutableString
lub wydrukować je za pomocą NSLog()
?Powtórzenie przez bajty NSData
Odpowiedz
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]];
}
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]];
}
}];
Czym powinna być linia doSomethingWithChar np. czy chcę dodać szesnastkową reprezentację bajtu do NSMutableString? – yannis
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. –