Plutôt que d'ajouter des octets à une mutable chaîne, créer une chaîne de caractères en utilisant les données:
//Be sure to use the right encoding:NSString*result =[[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
Si vous vraiment souhaitez faire une boucle à travers les octets:
NSMutableString*result =[NSMutableString string];constchar*bytes =[myData bytes];for(int i =0; i <[myData length]; i++){[result appendFormat:@"%02hhx",(unsignedchar)bytes[i]];}
Quelle devrait être la doSomethingWithChar ligne, par exemple, si je veux ajouter des octets de la représentation hexadécimale d'un NSMutableString? que faire si le nsdata n'est pas réellement une chaîne de caractères? que faire si il contient 0x00 octet, alors vous ne serez pas en mesure de parcourir l'ensemble de données.
Mise à jour! Depuis iOS 7, il y a un nouveau moyen privilégié pour itérer sur tous les octets dans un NSData objet.
Car un NSData peut maintenant être composés de plusieurs disjoints tableau d'octets morceaux sous le capot, l'appel de [NSData bytes] peut parfois être en mémoire inefficace, car elle a besoin d'aplatir l'ensemble de la sous-jacentes morceaux dans un seul tableau d'octets pour l'appelant.
Pour éviter ce problème, il est préférable d'énumérer les octets à l'aide de la enumerateByteRangesUsingBlock: méthode de NSData, qui sera de retour gammes existantes de la sous-jacentes des morceaux, à laquelle vous pouvez accéder directement sans avoir besoin de générer un nouveau tableau de structures. Bien sûr, vous devez être prudent de ne pas aller fouiller de façon inappropriée dans le C-gamme de style.
NSMutableString* resultAsHexBytes =[NSMutableString string];[data enumerateByteRangesUsingBlock:^(constvoid*bytes,NSRange byteRange,
BOOL *stop){//To print raw byte values as hexfor(NSUInteger i =0; i < byteRange.length;++i){[resultAsHexBytes appendFormat:@"%02x",((uint8_t*)bytes)[i]];}}];
Plutôt que d'ajouter des octets à une mutable chaîne, créer une chaîne de caractères en utilisant les données:
Si vous vraiment souhaitez faire une boucle à travers les octets:
que faire si le nsdata n'est pas réellement une chaîne de caractères? que faire si il contient 0x00 octet, alors vous ne serez pas en mesure de parcourir l'ensemble de données.
OriginalL'auteur dreamlax
Mise à jour! Depuis iOS 7, il y a un nouveau moyen privilégié pour itérer sur tous les octets dans un NSData objet.
Car un
NSData
peut maintenant être composés de plusieurs disjoints tableau d'octets morceaux sous le capot, l'appel de[NSData bytes]
peut parfois être en mémoire inefficace, car elle a besoin d'aplatir l'ensemble de la sous-jacentes morceaux dans un seul tableau d'octets pour l'appelant.Pour éviter ce problème, il est préférable d'énumérer les octets à l'aide de la
enumerateByteRangesUsingBlock:
méthode de NSData, qui sera de retour gammes existantes de la sous-jacentes des morceaux, à laquelle vous pouvez accéder directement sans avoir besoin de générer un nouveau tableau de structures. Bien sûr, vous devez être prudent de ne pas aller fouiller de façon inappropriée dans le C-gamme de style.OriginalL'auteur Jason LeBrun