Как использовать NSString - PullRequest
       18

Как использовать NSString

5 голосов
/ 05 ноября 2011

У меня есть строка, которую я хочу в виде байтового массива.До сих пор я использовал NSData для этого:

NSString *message = @"testing";
NSData *messageData = [message dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:YES];
NSUInteger dataLength = [messageData length];
Byte *byteData = (Byte*)malloc( dataLength );
memcpy( byteData, [messageData bytes], dataLength );

Но я знаю, что NSString имеет метод getBytes:maxLength:usedLength:encoding:options:range:remainingRange:, который позволил бы мне пропустить использование NSData все вместе.Моя проблема в том, что я не знаю, как правильно установить все параметры.

Я предполагаю, что передаваемый массив указателей должен быть malloc'ом, но я не уверен, как найти, сколько памятитаНос.Я знаю, что есть [NSString lengthOfBytesUsingEncoding:] и [NSString maximumLengthOfBytesUsingEncoding:], но я не знаю, нужны ли мне эти методы, и не до конца понимаю разницу между ними.Я предполагаю, что это будет то же значение, что и maxLength.Остальные параметры имеют смысл из документации.Любая помощь будет отличной.Благодаря.

1 Ответ

6 голосов
/ 05 ноября 2011

Разница между lengthOfBytesUsingEncoding: и maximumLengthOfBytesUsingEncoding: заключается в том, что первое является точным, но медленным (O (n)), а второе - быстрым (O (1)), но может возвращать значительно большее количество байтов, чем на самом деле необходимо. Единственная гарантия, которую дает maximumLengthOfBytesUsingEncoding:, заключается в том, что возвращаемое значение будет достаточно большим, чтобы содержать байты строки.

Как правило, ваши предположения верны. Таким образом, метод должен использоваться следующим образом:

NSUInteger numberOfBytes = [message lengthOfBytesUsingEncoding:NSUnicodeStringEncoding];
void *buffer = malloc(numberOfBytes);
NSUInteger usedLength = 0;
NSRange range = NSMakeRange(0, [message length]);
BOOL result = [message getBytes:buffer maxLength:numberOfBytes usedLength:&usedLength encoding:NSUnicodeStringEncoding options:0 range:range remainingRange:NULL];
...
free(buffer);
...