Преобразование шестнадцатеричной строки в двоичную в Objective-C - PullRequest
1 голос
/ 21 января 2012

Что эквивалентно функции PHP pack:

pack('H*', '01234567989abcdef' );

в Objective-C?

Ответы [ 2 ]

2 голосов
/ 21 января 2012

Предполагая, что вы хотите получить результаты как NSData, вы можете использовать функцию, подобную этой:

NSData *CreateDataWithHexString(NSString *inputString)
{
    NSUInteger inLength = [inputString length];

    unichar *inCharacters = alloca(sizeof(unichar) * inLength);
    [inputString getCharacters:inCharacters range:NSMakeRange(0, inLength)];

    UInt8 *outBytes = malloc(sizeof(UInt8) * ((inLength / 2) + 1));

    NSInteger i, o = 0;
    UInt8 outByte = 0;
    for (i = 0; i < inLength; i++) {
        UInt8 c = inCharacters[i];
        SInt8 value = -1;

        if      (c >= '0' && c <= '9') value =      (c - '0');
        else if (c >= 'A' && c <= 'F') value = 10 + (c - 'A');
        else if (c >= 'a' && c <= 'f') value = 10 + (c - 'a');            

        if (value >= 0) {
            if (i % 2 == 1) {
                outBytes[o++] = (outByte << 4) | value;
                outByte = 0;
            } else if (i == (inLength - 1)) {
                outBytes[o++] = value << 4;
            } else {
                outByte = value;
            }

        } else {
            if (o != 0) break;
        }        
    }

    return [[NSData alloc] initWithBytesNoCopy:outBytes length:o freeWhenDone:YES];
}
1 голос
/ 21 января 2012

См. -scanHex... методы NSScanner.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...