Я могу что-то упустить в стандартных библиотеках, но я так не думаю. У меня есть текущая реализация:
int char2hex(unsigned char c) {
switch (c) {
case '0' ... '9':
return c - '0';
case 'a' ... 'f':
return c - 'a' + 10;
case 'A' ... 'F':
return c - 'A' + 10;
default:
WARNING(@"passed non-hexdigit (%s) to hexDigitToInt()", c);
return 0xFF;
}
}
- (NSData *)decodeHexString {
ASSERT([self length] % 2, @"Attempted to decode an odd lengthed hex string.");
NSData *hexData = [self dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *resultData = [NSMutableData dataWithLength:([hexData length]) / 2];
const unsigned char *hexBytes = [hexData bytes];
unsigned char *resultBytes = [resultData mutableBytes];
for(NSUInteger i = 0; i < [hexData length] / 2; i++) {
resultBytes[i] = (char2hex(hexBytes[i + i]) << 4) | char2hex(hexBytes[i + i + 1]);
}
return resultData;
}
decodeHexString - это дополнение категории для NSString.
Что мне интересно, так это то, стоит ли поддерживать нечетные длинные шестнадцатеричные строки. И если так, как я должен?
P.S. Игнорировать мои макросы отладки. И я знаю, что синтаксис, используемый в операторе switch, является расширением GCC и может компилироваться не во всех компиляторах. Ох, и код работает как отправлено.