2013-11-08 3 views
1

Скажем, у меня есть строка, как например:О преобразовании из NSString в NSData

NSString *someString = @"123"; 

Затем преобразовать эту строку в экземпляр NSData как таковой:

NSData *someData = [NSData dataWithBytes:[someString UTF8String] length:[someString length]]; 

Насколько я понять, NSData - это, по сути, просто поток бит без кодирования. Мой вопрос: определяет ли NSData количество бит в каждой UTF8String, проверяя значение параметра длины? Другими словами, [someString UTF8String] возвращает строку C, содержащую символы «123», а [someString length] возвращает целое число 3. Является ли NSData понятным, что каждый символ должен состоять из 8 бит? Неужели я совершенно не понимаю смысла?

спасибо.

ответ

3

No.

+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length 

Этот метод занимает всего 2 параметра: void указатель на поток байтов в памяти и длину в терминах, сколько должно быть ta ken в объект NSData из этого байтового потока. Этот метод, как и любой другой, не имеет понятия и не волнует, как вы получили этот поток байтов и, конечно, ничего не знаете о UTF8String, он заботится только о типах данных, что они соответствуют сигнатуре метода.

Ваше представление о том, как определить длину строки, также неверно, как объяснил Маттиас. Для этого используйте функцию strlen C. Эта функция проверяет нулевой символ окончания строки \ 0.

+0

Да, я вижу сейчас. Спасибо, что поняли это. Я был разработчиком iOS около 5 лет, я немного смущен, что не знал различия. : X EDIT: Ах, я понимаю, почему я был смущен сейчас - все это время у меня создалось впечатление, что это BITS, а не байты (для первого параметра) - все имеет смысл сейчас, спасибо снова. –

3

length возвращает длину строки, как в «Число символов Юникода», она не возвращает количество байтов в хранилище.

Чтобы преобразовать NSString в NSData вы должны использовать что-то вроде этого:

NSString *someString = @"123"; 
NSData *someData = [someString dataUsingEncoding:NSUTF8StringEncoding]; 

Что вы делаете, работает для UTF8, который содержит только ASCII, потому что даже в UTF8 символы ASCII занимает только 1 байт. По совпадению, «логическая» длина строки соответствует размеру его резервного хранилища.

Попробуйте со строкой, которая содержит символы вне диапазона ASCII, и вы увидите разные результаты:

NSString *asciiString = @"123"; 
NSLog(@"\"%@\" - Length: %ld", asciiString, (long)[asciiString length]); 
NSData *asciiData = [asciiString dataUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"Data length: %ld", [asciiData length]); 

NSString *utf8String = @""; 
NSLog(@"\"%@\" - Length: %ld", utf8String, (long)[utf8String length]); 
NSData *utf8Data = [utf8String dataUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"Data length: %ld", [utf8Data length]); 

utf8String = @"oö"; 
NSLog(@"\"%@\" - Length: %ld", utf8String, (long)[utf8String length]); 
utf8Data = [utf8String dataUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"Data length: %ld", [utf8Data length]); 

Урожайность:

"123" - Length: 3 
Data length: 3 
"" - Length: 2 
Data length: 4 
"oö" - Length: 2 
Data length: 3 
+0

Вы прочитали все, что я написал? Lol - Пожалуйста, перечитайте, а затем ответьте на мой вопрос. Постскриптум - dataWithBytes: length: отлично работает для преобразования NSString в NSData. Ваш код и мой код дают тот же результат. - Кроме того, это не значит, что нужно оторваться от резкого тона. –

+0

затем попробуйте со строкой, которая содержит не только ASCII –

+0

Ah. Понимаю. Хорошая точка зрения. Тем не менее, не могли бы вы ответить на мой вопрос? –

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