Должна ли я поддерживать нечетные шестнадцатеричные строки, и если да, то как? - PullRequest
1 голос
/ 12 ноября 2009

Я могу что-то упустить в стандартных библиотеках, но я так не думаю. У меня есть текущая реализация:

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 и может компилироваться не во всех компиляторах. Ох, и код работает как отправлено.

1 Ответ

2 голосов
/ 12 ноября 2009

Вероятно, стоит поддержать. Вы можете начать с удаления первой цифры и увеличения начального индекса цикла, если [hexData length] % 2 не равен нулю непосредственно перед циклом for в decodeHexString.

...