2012-05-06 32 views

cevap

28

Aksine bir değişken dize bayt ekleme yerine, verileri kullanarak bir dize oluşturun:

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

Eğer gerçekten bayt döngü isterseniz:

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 satırı, örn. Bir NSMutableString bayt onaltılık temsilini eklemek istiyorsanız? – yannis

+0

nsdata aslında bir dizge değilse? 0x00 bayt içeriyorsa, tüm verilerde yineleyemezsiniz. –

11

Güncelleme! IOS 7'den beri, bir NSData nesnesindeki tüm baytlarda yineleme yapmak için yeni ve tercih edilen bir yol var. Bu arayan için tek bir bayt dizisi temel parçalar tüm düzleştirmek için gerektiğinden, çağıran NSData hemen başlık altında birden fazla ayrık bayt dizisi topakları meydana gelebilir çünkü

, [NSData bytes] bazen bellek verimsiz olabilir.

Bu davranıştan kaçınmak için, NSData öğesinin enumerateByteRangesUsingBlock: yöntemini kullanarak baytları sıralamak daha iyidir; bu, mevcut altta yatan parçaların aralıklarını döndürerek, herhangi bir yeni dizi yapısı oluşturmaya gerek duymadan doğrudan erişebilmenizi sağlar. Tabii ki, sağlanan C-stili dizide uygunsuz bir şekilde etrafta dolaşmamaya dikkat etmelisiniz.

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

}];