Objective c NSData从NSKeyedArchiver到NSString

Objective c NSData从NSKeyedArchiver到NSString,objective-c,cocoa,nsstring,nsdata,nskeyedarchiver,Objective C,Cocoa,Nsstring,Nsdata,Nskeyedarchiver,我正在尝试将从NSKeyedArchiver生成的NSData转换为NSString,以便传递它,并最终将其转换回NSData。我必须将其作为字符串传递(我使用three20 URL传递)。我已经通过了各种编码,UTF8,ASCII等,但无法得到任何工作。NSKeyedArchiver说NSData的格式是一个属性列表:NSPropertyListBinaryFormat_v1_0 有人知道我如何将这个NSData转换成字符串,然后再转换回来吗?字符串的大小不是问题 谢谢您需要做的就是这样: N

我正在尝试将从NSKeyedArchiver生成的NSData转换为NSString,以便传递它,并最终将其转换回NSData。我必须将其作为字符串传递(我使用three20 URL传递)。我已经通过了各种编码,UTF8,ASCII等,但无法得到任何工作。NSKeyedArchiver说NSData的格式是一个属性列表:NSPropertyListBinaryFormat_v1_0

有人知道我如何将这个NSData转换成字符串,然后再转换回来吗?字符串的大小不是问题


谢谢

您需要做的就是这样:

NSData *dataFromString = [[NSString stringWithFormat:@"%@", yourString] dataUsingEncoding:NSASCIIStringEncoding];
然后提取数据:

NSString *stringFromData = [[NSString alloc] initWithData:dataFromString encoding:NSASCIIStringEncoding];
你想要的是:

id<nscoding> obj;

NSData * data     = [NSKeyedArchiver archivedDataWithRootObject:obj];
NSString * string = [data base64EncodedString];
id-obj;
NSData*data=[NSKeyedArchivedDatawithRootObject:obj];
NSString*string=[database64encodedstring];
然后反过来

NSString * string;

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

您可以添加base64EncodedString和dataFromBase64String:以及此处可用的NSData类别,但现在默认情况下,它包括在iOS 9.2.1、Xcode 7.2.1、ARC启用中

base64EncodedString,dataFromBase64String:在iOS 7.0之后折旧

更新的解决方案:

编码为字符串:

id-obj;
NSData*data=[NSKeyedArchivedDatawithRootObject:obj];
NSString*string=[Database64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
解码到数据:

NSString*string;
NSData*data=[[NSData alloc]initWithBase64EncodedString:字符串选项:(NSDataBase64DecodingIgnoreUnknownCharacters)];
id obj=[NSKeyedUnarchiver unarchiveObjectWithData:data];
注意:当使用keychain将键/值对字典存储到kSecValueData中时,这非常有用。


希望这对别人有帮助!干杯。

不幸的是,我不知道为什么,这似乎不起作用。我得到了一个很短的字符串,例如“bplist00Ô”作为我的输出。这确实很奇怪。我将测试一些东西作为备选方案,然后(希望)返回给您一些有用的东西。我发布的文章为我做了一些技巧,不过我注意到,如果您使用不同的方法将数据解码为字符串,而不是编码数据,则会出现错误。在对字符串进行编码后,可以通过将
retain
添加到
dataFromString
实例来解决此问题。希望这能解决您遇到的问题。如果没有,则有另一种可能的路线可供选择(如有必要)注意:现在是
[data base64EncodedStringWithOptions:
id<nscoding> obj;

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

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