2011-06-21 7 views
6

Mam NSString z ciągiem szesnastkowym jak "68656C6C6F", co oznacza "cześć".Jak przekonwertować HEX na NSString w Objective-C?

Teraz chcę przekonwertować ciąg szesnastkowy na inny obiekt NSString, który pokazuje "cześć". Jak to zrobić ?

+0

celu wyjaśnienia, to ciąg hex NSString lub liczbą całkowitą? Myślę, że niektórzy z twoich odbierających mogą być zdezorientowani. – nil

+0

Szesnastkowy łańcuch to NSString i chcę go przekonwertować na inny NSString, który reprezentuje "cześć". – user403015

+0

Dobrze, zaktualizuj swoje pytanie tymi informacjami, aby nikt inny nie zrobił tego samego błędu ponownie. – nil

Odpowiedz

19

Jestem pewien, że istnieją o wiele lepsze, sprytniejsze sposoby, aby to zrobić, ale to rozwiązanie faktycznie działa.

NSString * str = @"68656C6C6F"; 
NSMutableString * newString = [[[NSMutableString alloc] init] autorelease]; 
int i = 0; 
while (i < [str length]) 
{ 
    NSString * hexChar = [str substringWithRange: NSMakeRange(i, 2)]; 
    int value = 0; 
    sscanf([hexChar cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value); 
    [newString appendFormat:@"%c", (char)value]; 
    i+=2; 
} 
-2
+(NSString*)intToHexString:(NSInteger)value 
{ 
return [[NSString alloc] initWithFormat:@"%lX", value]; 
} 
+0

Czy należy wprowadzić "68656C6C6F" do wartości argumentu? Myślę też, że twoje rozwiązanie nie jest poprawne. – user403015

+6

Nie tylko nie jest to prawidłowe, ale również łamie zasadę własności. Zadowolony system do debugowania/usuwania nieszczelności. – JustSid

+0

Myślę, że jest to najlepsza odpowiedź, dodałem więcej przykładowego kodu w odpowiedzi z dołu poniżej. – dancl

3

ten powinien zrobić:

- (NSString *)stringFromHexString:(NSString *)hexString { 

    // The hex codes should all be two characters. 
    if (([hexString length] % 2) != 0) 
     return nil; 

    NSMutableString *string = [NSMutableString string]; 

    for (NSInteger i = 0; i < [hexString length]; i += 2) { 

     NSString *hex = [hexString substringWithRange:NSMakeRange(i, 2)]; 
     NSInteger decimalValue = 0; 
     sscanf([hex UTF8String], "%x", &decimalValue); 
     [string appendFormat:@"%c", decimalValue]; 
    } 

    return string; 
} 
+0

[hex UTF8String] powinno być [hex cStringUsingEncoding: NSASCIIStringEncoding] jeśli jest hexem to ASCII – valexa

-1

Myślę, że ludzie doradzanie initWithFormat jest najlepszą odpowiedź, jak to objective-c zamiast mieszanką ObjC, C .. (chociaż przykładowy kod jest nieco lakoniczny) .. zrobiłem następujące

unsigned int resInit = 0x1013; 
if (0 != resInit) 
{ 
    NSString *s = [[NSString alloc] initWithFormat:@"Error code 0x%lX", resInit]; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Initialised failed" 
     message:s 
     delegate:nil 
     cancelButtonTitle:@"OK" 
     otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    [s release]; 
}