NSData из NSKeyedArchiver в NSString

Я пытаюсь преобразовать NSData, сгенерированные из NSKeyedArchiver, в NSString, чтобы я мог передать его и в конечном итоге преобразовать обратно в NSData. Я должен передать это как строку (я использую URL-адрес three20). Я прошел через различные кодировки, UTF8, ASCII и т.д., и ничего не могу заставить работать. NSKeyedArchiver говорит, что NSData сформирована как список свойств: NSPropertyListBinaryFormat_v1_0.

Кто-нибудь знает, как я могу преобразовать эти NSData в String и обратно? Размер строки не является проблемой.

Спасибо


person kodai    schedule 23.05.2011    source источник


Ответы (3)


Вы хотите:

id<nscoding> obj;

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

А потом наоборот

NSString * string;

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

Вы можете добавить base64EncodedString и dataFromBase64String: с доступной здесь категорией NSData NSData + Base64, но теперь она включена по умолчанию

person Nicolas Manzini    schedule 11.07.2013
comment
Примечание: сейчас это[data base64EncodedStringWithOptions: - person Albert Renshaw; 05.06.2018

iOS 9.2.1, Xcode 7.2.1, ARC включен

base64EncodedString, dataFromBase64String: устарело после iOS 7.0

Обновленное решение:

Кодировать в строку:

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

Примечание. Это очень полезно при работе с связкой ключей для хранения словаря пар ключ / значение в kSecValueData.

Надеюсь, это кому-то поможет! Ваше здоровье.

person serge-k    schedule 02.03.2016

Все, что вам нужно сделать, это что-то вроде этого:

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

затем извлечь данные:

NSString *stringFromData = [[NSString alloc] initWithData:dataFromString encoding:NSASCIIStringEncoding];
person justin    schedule 23.05.2011
comment
К сожалению, и я не знаю почему, похоже, это не работает. В качестве вывода я получаю очень короткую строку, например bplist00Ô. - person kodai; 24.05.2011
comment
Это определенно странно. Я собираюсь протестировать пару вещей в качестве альтернативы и вернуться к вам (надеюсь) с тем, что действительно работает. - person justin; 24.05.2011
comment
То, что я опубликовал, помогло мне, хотя я заметил, что если вы декодируете данные в строку с помощью другого метода, чем когда вы их кодируете, вы получаете ошибки. Это можно исправить, добавив retain к экземпляру dataFromString после того, как вы закодируете свою строку. Надеюсь, это решит возникшую у вас проблему. В противном случае есть другой возможный маршрут, которым можно воспользоваться при необходимости. - person justin; 24.05.2011