Как передать NSData как NSString и вернуть его обратно? - PullRequest
6 голосов
/ 02 апреля 2012

У меня есть объект NSData.

Я хочу преобразовать ее в строку, передать функции, а затем снова преобразовать обратно в объект NSData.

Но как?

Я пыталсяэтот метод, но значение NSData отличается от исходного!

вот мой код:

  // a generic class
  APClass *c = [[APClass alloc] init];
  c.aNumber = 123;
  c.aString = @"my string";

  // my data obj
  NSMutableData *data = [NSMutableData data];

  // archiver to store class in nsdata
  NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
  [encoder encodeObject:[NSNumber numberWithInt:c.aNumber] forKey:@"aNum"];
  [encoder encodeObject:c.aString forKey:@"aStr"];
  [encoder finishEncoding];
  [encoder release];

  [c release];

  NSLog(@"%@", data);
  NSString *d = [NSString stringWithFormat:@"%@", data];

  // ---

  NSString *strFromData = [NSString stringWithFormat:@"%@", d];

  NSData *dataNM = [strFromData dataUsingEncoding:NSUTF8StringEncoding];

  // decoder to retrieve class from nsdata      
  NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:dataNM];
  int number       = [[decoder decodeObjectForKey:@"aNum"] intValue];
  NSString *string = [decoder decodeObjectForKey:@"aStr"];
  [decoder finishDecoding];
  [decoder release];

  NSLog(@"[Number: %d] -- [String: %@]", number, string);

Как я могу преобразовать обратно в исходный NSData?

данные и dataNM различаются по размеру.Компилятор возвращает эту ошибку:

2012-04-02 16: 33: 28.269 DataTest [18008: f803] - [__NSCFData objectForKey:]: нераспознанный селектор, отправленный экземпляру 0x6b46c80

2012-04-02 16: 33: 28.270 DataTest [18008: f803] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSCFData objectForKey:]: нераспознанный селектор, отправленный экземпляру 0x6b46c80'

спасибо.

Ответы [ 3 ]

5 голосов
/ 03 апреля 2012

Решено.

Использование dataUsingEncoding, значение NSData отличается.

Для передачи данных по методам или приложениям и т. Д. Я использовал преобразование base64.

Кодировать

NSString *d = 
  [NSString stringWithFormat:@"appdue://obj=%@", 
     [APBase64Converter base64forData:data]];

Декодировать

NSData *data = [APBase64Converter base64DataFromString:urlParams];

APBase64Converter Это библиотека, которая легко кодирует / декодирует данные и строки.

Рабочий пример и APBase64Converter lib можно скачать здесь: http://goo.gl/8YNjS

Спасибо всем.

Я "сохраняю" этот пост для помощи людям и мне в следующий раз!

0 голосов
/ 12 апреля 2013

Используйте класс Base64, он доступен в github

        DatabaseResult* result = [self.database executeQuery:@"SELECT * FROM `images`       WHERE image_id = ? AND imagetype = ?", self.routeId,self.imagetype];

        for(EGODatabaseRow* row in result) {

        NSString *strImage=[row stringForColumn:@"image_photo"];

        [Base64 initialize];

        NSData *data = [Base64 decode:strImage];

        UIImage *image=[UIImage imageWithData:data];

        }

Вот как я преобразую строку в данные, а затем данные в изображение.

0 голосов
/ 02 апреля 2012

Используйте
NSData до NSString:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
и
NSString до NSData:
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

с кодировкой
NSUTF8StringEncoding
или
NSMacOSRomanStringEncoding (что является 8-битной кодировкой).

...