Преобразование двоичных битов в шестнадцатеричное значение - PullRequest
1 голос
/ 25 ноября 2011

Как преобразовать двоичные данные в шестнадцатеричное значение в obj-c?Пример:

1111 = F, 
1110 = E, 
0001 = 1, 
0011 = 3.

У меня есть NSString 10010101010011110110110011010111, и я хочу преобразовать его в шестнадцатеричное значение.В данный момент делаю вручную.Что,

-(NSString*)convertToHex:(NSString*)hexString

{NSMutableString * convertingString = [[NSMutableString alloc] init];

for (int x = 0; x < ([hexString length]/4); x++) {

    int a = 0;
    int b = 0; 
    int c = 0;
    int d = 0;

    NSString *A = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x)]];
    NSString *B = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+1)]];
    NSString *C = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+2)]];
    NSString *D = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+3)]];


    if ([A isEqualToString:@"1"]) { a = 8;}

    if ([B isEqualToString:@"1"]) { b = 4;}

    if ([C isEqualToString:@"1"]) { c = 2;}

    if ([D isEqualToString:@"1"]) { d = 1;}

    int total = a + b + c + d;

    if (total < 10) { [convertingString appendFormat:@"%i",total]; }
    else if (total == 10) { [convertingString appendString:@"A"]; }
    else if (total == 11) { [convertingString appendString:@"B"]; }
    else if (total == 12) { [convertingString appendString:@"C"]; }
    else if (total == 13) { [convertingString appendString:@"D"]; }
    else if (total == 14) { [convertingString appendString:@"E"]; }  
    else if (total == 15) { [convertingString appendString:@"F"]; } 

}

NSString *convertedHexString = convertingString;
return [convertedHexString autorelease];
[convertingString release];

}

У кого-нибудь есть предложения лучше?Это занимает слишком много времени.Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 25 ноября 2011
@interface bin2hex : NSObject
+(NSString *)convertBin:(NSString *)bin;
@end
@implementation bin2hex
+(NSString*)convertBin:(NSString *)bin
{
    if ([bin length] > 16) {

        NSMutableArray *bins = [NSMutableArray array];
        for (int i = 0;i < [bin length]; i += 16) {
            [bins addObject:[bin substringWithRange:NSMakeRange(i, 16)]];
        }

        NSMutableString *ret = [NSMutableString string];
        for (NSString *abin in bins) {
            [ret appendString:[bin2hex convertBin:abin]];
        }

        return ret;

    } else {
        int value = 0;
        for (int i = 0; i < [bin length]; i++) {
            value += pow(2,i)*[[bin substringWithRange:NSMakeRange([bin length]-1-i, 1)] intValue];
        }
        return [NSString stringWithFormat:@"%X", value];
    }
}

@end

int main (int argc, const char * argv[])
{

    @autoreleasepool {

        // insert code here...
        NSLog(@"0x%@",[bin2hex convertBin:@"10010101010011110110110011010111"]);

    }
    return 0;
}

Я получаю результат 0x954F6CD7 для 10010101010011110110110011010111, и кажется, что он мгновенный

1 голос
/ 30 ноября 2011

Сам я никогда не был хакером C, но такая проблема идеально подходит для C, так что вот мое скромное предложение - закодировано как тестовый код для запуска на Mac, но вы должны иметь возможность скопировать соответствующийНемного об использовании под iOS:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

    NSString *str = @"10010101010011110110110011010111";

    char* cstr = [str cStringUsingEncoding: NSASCIIStringEncoding];

    NSUInteger len = strlen(cstr);

    char* lastChar = cstr + len - 1;
    NSUInteger curVal = 1;

    NSUInteger result = 0;

    while (lastChar >= cstr) {

        if (*lastChar == '1')
        {
            result += curVal;
        }
        /*
        else 
        {
            // Optionally add checks for correct characters here
        }
        */

        lastChar--;
        curVal <<= 1;
    }

    NSString *resultStr = [NSString stringWithFormat: @"%x", result];

    NSLog(@"Result: %@", resultStr);

    [p release];
}

Кажется, это работает, но я уверен, что еще есть возможности для улучшения.

0 голосов
/ 25 ноября 2011

Может быть, проще всего было бы настроить NSDictionary для быстрого поиска?

[NSDictionary dictionaryWithObjects...]

, поскольку это ограниченное количество записей.

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