Як перетворити значення NSString в NSData?


Відповіді:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

Які плюси та мінуси використання UTF-8 на відміну від чогось вищого, як UTF-16 або UTF-32?
Альберт Реншо

4
NSData не надто переймається тим, чи це UTF-8, або UTF-16 або UTF-32. Є дві проблеми: Одна, UTF-16 і UTF-32 повинні мати правильне впорядкування байтів. Двоє, хто перетворює його назад у NSString *, повинен знати кодування і часто буде приймати кодування UTF-8. Як правило, з UTF-8, швидше за все, керуються правильно.
gnasher729

1
@bendytree насправді ні, це не відбувається, -dataUsingEncoding: поверне ненульовий рядок, який є тим, що stringWithUTF8String: вимагає, ви маєте межі для читання пам'яті, яку ви не хочете. Що перетворює його назад, це: -initWithData: encoding :.
Психо

1
@Albert Renshaw в даний час (немає гарантії, що речі залишаються таким чином) NSStringвикористовує UTF-16 внутрішньо, тому може бути невеликий приріст продуктивності, оскільки він не повинен робити перетворення UTF-16 <-> UTF-8. Особисто ми вважаємо за краще (як @ gnasher729 пропонує) надійність над продуктивністю та використовуємо UTF-8 скрізь.
Деякий розробник

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

ви можете посилатися на це посилання


3
Одне лайнерне рішення:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
Раптор

32

Зробіть:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

то сміливо продовжуйте NSJSONSerialization:JSONObjectWithData.


Виправлення відповіді щодо термінатора NULL

Після коментарів, офіційної документації та перевірок , ця відповідь була оновлена ​​стосовно вилучення імовірного термінатора NULL:

  1. Як задокументовано данимиUsingEncoding ::

    Повернене значення

    Результат виклику dataUsingEncoding:allowLossyConversion:NO як другого аргументу

  2. Як задокументовано getCString: maxLength: encoding: і cStringUsingEncoding ::

    зауважте, що дані, що повертаються, dataUsingEncoding:allowLossyConversion:не є строгим C-рядком, оскільки він не має термінала NULL


14
Це неправильно! Будь ласка , дивіться мій пост тут: stackoverflow.com/q/14087094/192819
jpswain

4
Так. dataUsingEncoding:не повертає недійсні дані. Тільки UTF8Stringй інші методи, що повертають рядок C, повертають нульову завершену рядок.
Пітер Хосей

@PeterHosey У вас є джерело для цього? Мені важко знайти це в будь-яких документах.
короткометражки

1
Дякуємо @PeterHosey, документи, які ви зв'язали там , явно заявляють про відсутність припинення NULL - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). Я, мабуть, пропустив це раніше. Я обов'язково напишу щось у майбутньому.
shortstuffsushi

1
(Для всіх, хто цікавиться: цитата короткометражних кадрів під cStringUsingEncoding:. Я переглядав dataUsingEncoding:.)
Пітер Хосей

20

У випадку, коли сюди заходить Swift Developer,

конвертувати з NSString / String в NSData

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Завдання-C:

NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Швидкий:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String

Можливо, в порівнянні з іншими методами, що займає процесор, але дуже корисно, якщо ви шукаєте доступ до файлової системи для наполегливості
Stephen J

10

По-перше, ви повинні використовувати dataUsingEncoding:замість того, щоб пройти UTF8String. Ви використовуєте лише UTF8Stringтоді, коли вам потрібна Cрядок у кодуванні.

Тоді для цього UTF-16просто передайте NSUnicodeStringEncodingзамість NSUTF8StringEncodingсвого dataUsingEncoding:повідомлення.


7

Для Swift 3 ви в основному будете переходити Stringдо Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
Ця відповідь неправильна, якщо strмістить кодові точки, що перевищують 127. Це пояснюється тим, що str.lengthдає кількість символів Unicode, а не кількість байтів. Наприклад, якщо strє @"にほんご", str.lengthдає 4, а str.UTF8Stringнасправді містить 12 байт. Навіть якщо ви заміните str.lengthна strlen(str.UTF8String), це все одно буде неправильним для випадку, коли strмістить символ NULL, наприклад @"にほ\0んご".
Панг

Об'єкт NSData, створений таким чином, кидає exeption при використанні з [NSJSONSerialization JSONObjectWithData: параметри даних: NSJSONReadingMutableLeaves: & error];
Абадольс

2

Завдання-C:

NSString до NSData:

NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];

NSData до NSString:

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

Швидкий:

Рядок до даних:

var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)

Дані для рядків:

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!


0

Ціль-С

NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

Швидкий

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.