Это старая тема, но я хотел бы добавить несколько замечаний.
• Сканирование строки с помощью [NSString characterAtIndex]
не очень эффективно.
Получить строку C в UTF8, затем отсканировать ее с помощью *char++
намного быстрее.
• Лучше выделять NSMutableData
с емкостью, чтобы избежать трудоемкого изменения размера блока. Я думаю, что NSData еще лучше (см. Следующий пункт)
• Вместо создания NSData с использованием malloc, затем [NSData dataWithBytes]
и, наконец, освобождения, используйте malloc и [NSData dataWithBytesNoCopy:length:freeWhenDone:]
Также избегает операций с памятью (перераспределение, копирование, освобождение). Логическое значение freeWhenDone сообщает NSData о том, что он должен стать владельцем блока памяти и освободить его, когда он будет освобожден.
• Вот функция, которую я должен преобразовать шестнадцатеричные строки в байтовые блоки. Существует не так много ошибок проверки входной строки, но распределение проверяется.
Форматирование входной строки (например, удаление 0x, пробелов и знаков пунктуации) лучше вне функции преобразования.
Зачем нам терять время на дополнительную обработку, если мы уверены, что ввод в порядке.
+(NSData*)bytesStringToData:(NSString*)bytesString
{
if (!bytesString || !bytesString.length) return NULL;
// Get the c string
const char *scanner=[bytesString cStringUsingEncoding:NSUTF8StringEncoding];
char twoChars[3]={0,0,0};
long bytesBlockSize = formattedBytesString.length/2;
long counter = bytesBlockSize;
Byte *bytesBlock = malloc(bytesBlockSize);
if (!bytesBlock) return NULL;
Byte *writer = bytesBlock;
while (counter--) {
twoChars[0]=*scanner++;
twoChars[1]=*scanner++;
*writer++ = strtol(twoChars, NULL, 16);
}
return[NSData dataWithBytesNoCopy:bytesBlock length:bytesBlockSize freeWhenDone:YES];
}