2011-05-23 5 views
6

J'essaie de convertir NSData généré à partir de NSKeyedArchiver en un NSString afin que je puisse le transmettre et éventuellement le convertir en NSData. Je dois passer cela comme une chaîne (j'utilise trois passes URL). J'ai traversé différents encodages, UTF8, ASCII, etc. et je ne peux rien faire. NSKeyedArchiver indique que NSData est formulé comme une liste de propriétés: NSPropertyListBinaryFormat_v1_0.NSData de NSKeyedArchiver à NSString

Est-ce que quelqu'un a une idée de comment je peux convertir ce NSData en chaîne et revenir? La taille de la chaîne n'est pas un problème.

Merci

Répondre

11

Qu'est-ce que vous voulez est:

id<nscoding> obj; 

NSData * data  = [NSKeyedArchiver archivedDataWithRootObject:obj]; 
NSString * string = [data base64EncodedString]; 

Et puis le oth er autour

NSString * string; 

NSData * data = [NSData dataFromBase64String:string]; 
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data] 

Vous pouvez ajouter base64EncodedString et dataFromBase64String: avec la catégorie NSData ici NSData+Base64, mais il est maintenant inclus par défaut

1

Tout ce que vous devriez avoir à faire est quelque chose comme ceci:

NSData *dataFromString = [[NSString stringWithFormat:@"%@", yourString] dataUsingEncoding:NSASCIIStringEncoding]; 

puis d'extraire les données:

NSString *stringFromData = [[NSString alloc] initWithData:dataFromString encoding:NSASCIIStringEncoding]; 
+0

Malheureusement, et je ne sais pas pourquoi, cela ne semble pas fonctionner. Je reçois une chaîne très courte, par exemple "bplist00Ô" comme sortie. – kodai

+0

C'est vraiment étrange. Je vais tester quelques choses comme des alternatives et revenir à vous avec (heureusement) quelque chose qui fonctionne – justin

+0

Ce que j'ai posté a fait l'affaire pour moi, mais j'ai remarqué que si vous décoder les données dans une chaîne d'une autre méthode que lorsque vous l'encodez, vous obtenez des fautes. Cela peut être résolu en ajoutant 'retain' à l'instance' dataFromString' après avoir encodé votre chaîne. J'espère que cela résout le problème que vous aviez. Sinon, il y a une autre route possible à prendre si nécessaire – justin

2

iOS 9.2.1, Xcode 7.2.1, ARC a permis

base64EncodedString, dataFromBase64String: dépréciée après iOS 7,0

solution Mise à jour:

Encode chaîne:

id<nscoding> obj; 

NSData *data  = [NSKeyedArchiver archivedDataWithRootObject:obj]; 
NSString *string = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; 

Decode aux données:

NSString *string; 

NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:(NSDataBase64DecodingIgnoreUnknownCharacters)]; 
id<nscoding> obj = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Note: Ceci est très utile lorsque vous travaillez avec trousseau pour stocker un dictionnaire de paires clé/valeur dans kSecValueData.

Espérons que cela aide quelqu'un! À votre santé.