2013-03-02 4 views
1

У меня есть два объекта 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? Или я использую его неправильно?

+1

Почему вы преобразовываете строки в данные? Почему бы просто не архивировать исходные строки? Это позволит сэкономить много ненужных конверсий. – rmaddy

+1

Возможно, это: '[NSString stringWithUTF8String: [data1After bytes]];' должно быть: '[[NSString alloc] initWithData: data1After encoding: NSUTF8StringEncoding];' – rmaddy

+0

@rmaddy # 1: Потому что я должен поддерживать всевозможные разные данные устанавливает в объектах NSData, а не только строки. # 2: Это здорово! Это исправило это, спасибо! Если вы опубликуете это в качестве ответа, я с радостью пометю его как решение. – todd412

ответ

1

Благодаря rmaddy его ответа выше- мне просто нужно, чтобы заменить это:

[NSString stringWithUTF8String:[data1After bytes]]; 

с этим:

[[NSString alloc] initWithData:data1After encoding: NSUTF8StringEncoding]; 

и установил ее.

+0

Обратите внимание, что это работает там, где 'NSString stringWithUTFString: ...' не делает - для кого-то еще вытягивает волосы ... –

 Смежные вопросы

  • Нет связанных вопросов^_^