Приведение NSString к NSData

Есть ли способ сохранить NSString в NSData с сохранением SAME данных?

Пример (это хорошо, но это не то, что мне нужно):

NSString *tmpString = @"Hello World!";
NSData *nsdataString = [tmpString dataUsingEncoding:NSUTF8StringEncoding];


Мне нужно что-то вроде этого (очевидно, что оно не работает):

NSData nsdataString = @"Hello World!";


В двух словах: мне нужно использовать NSData, как если бы это было ТО ЖЕ САМОЕ, что и NSString (например, с использованием оператора приведения). Этот подход очень полезен для предварительной загрузки зашифрованной базы данных sqlite основных данных (в NSString) и расшифровки только тогда, когда пользователь обращается к полям постоянного хранилища. Для расшифровки я использую:

NSData *decryptedData = [encryptedData AES256DecryptWithKey:keyString];

Где EncryptedData — это NSData, а keyString — это NSString.

Большое спасибо всем!


person ndman    schedule 05.10.2012    source источник


Ответы (1)


Краткий ответ: нет.

Объект NSData является оболочкой для необработанной последовательности единиц и нулей. Объект NSString является оболочкой для массива символов Unicode в кодировке, которая не предоставляется.

В зависимости от кодировки строки, используемой для записи NSData, она может представлять несколько разных строк. Например: строки UTF16 с прямым порядком байтов и UTF16 с прямым порядком байтов, представляющие одни и те же символы, будут выглядеть по-разному, и попытка проанализировать строку UTF-8 как UTF-16 даст вам тарабарщину.

Вот почему вы всегда должны преобразовывать NSData в NSString, прежде чем рассматривать его как строку: потому что, пока вы не укажете кодировку, это не строка; это просто необработанные единицы и нули.

Я не уверен из вашего вопроса, почему именно вы хотите это сделать, но возможно, вы можете выполнить то, что вам нужно, с помощью строки C (вместо NSString), которую вы можете получить с помощью метода NSData -bytes. Однако вам все равно нужно помнить о кодировке, если вы хотите получить полезную строку в любой момент.

person chapka    schedule 17.10.2012