У меня есть два объекта NSData, которые я хочу сохранить в третьем объекте NSData. Идея заключается в том, что я хочу упростить, когда я позже расшифрую более крупный объект, чтобы получить два меньших объекта независимо друг от друга, не беспокоясь об их относительных размерах или типах данных.Могу ли я архивировать объекты NSData внутри других NSData без искажения данных?
Похоже, что лучший способ сделать это - использовать NSKeyedArchiver для создания своего рода структуры ключевого значения на уровне корня в более крупном объекте NSData, в котором я могу хранить два небольших объекта в отдельных ключах. Это то, что я пытался сделать здесь:
NSData *data1Before = [@"abcdefgh" dataUsingEncoding:NSUTF8StringEncoding];
NSData *data2Before = [@"ijklmnop" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *allData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:allData];
[archiver encodeObject:data1Before forKey:@"key1"];
[archiver encodeObject:data2Before forKey:@"key2"];
[archiver finishEncoding];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:allData];
NSData *data1After = [unarchiver decodeObjectForKey:@"key1"];
NSData *data2After = [unarchiver decodeObjectForKey:@"key2"];
[unarchiver finishDecoding];
NSString *string1After = [NSString stringWithUTF8String:[data1After bytes]];
NSString *string2After = [NSString stringWithUTF8String:[data2After bytes]];
NSLog(@"after1: %@",string1After);
NSLog(@"after2: %@",string2After);
Проблема, когда вы запустите этот код снова и снова, вы получите все виды различных результатов, поступающих от специальных символов в NSLog statements- someetimes получить прилагается к конец строк, иногда они просто NULL.
Похоже, что это повреждение имеет какое-то отношение к этому процессу «двойного кодирования», который я использую. Когда я изменяю код так, чтобы NSKeyedArchiver просто вызывал encodeObject непосредственно на NSStrings, а не на объекты NSData, я могу позже использовать decodeObjectForKey и без проблем получить эти строки без каких-либо проблем.
Есть ли лучший способ сделать это, чем использовать NSKeyedArchiver? Или я использую его неправильно?
Почему вы преобразовываете строки в данные? Почему бы просто не архивировать исходные строки? Это позволит сэкономить много ненужных конверсий. – rmaddy
Возможно, это: '[NSString stringWithUTF8String: [data1After bytes]];' должно быть: '[[NSString alloc] initWithData: data1After encoding: NSUTF8StringEncoding];' – rmaddy
@rmaddy # 1: Потому что я должен поддерживать всевозможные разные данные устанавливает в объектах NSData, а не только строки. # 2: Это здорово! Это исправило это, спасибо! Если вы опубликуете это в качестве ответа, я с радостью пометю его как решение. – todd412