2011-06-21 9 views
6

Tengo un NSString con cadena hexagonal como "68656C6C6F" que significa "hola".Cómo convertir HEX a NSString en Objective-C?

Ahora quiero convertir la cadena hexadecimal en otro objeto NSString que muestra "hola". Como hacer eso ?

+0

Para aclarar, ¿la cadena hexadecimal es un NSString o un número entero? Creo que algunos de los que responden pueden estar confundidos al respecto. – nil

+0

La cadena hexadecimal es un NSString, y quiero convertirlo en otro NSString que represente "hola" – user403015

+0

Bueno, actualice su pregunta con esa información para que nadie más vuelva a cometer el mismo error. – nil

Respuesta

19

Estoy seguro de que hay formas mejores y más inteligentes de hacerlo, pero esta solución realmente funciona.

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

¿Debo ingresar "68656C6C6F" en el valor del argumento? También creo que su solución no es correcta. – user403015

+6

No solo no es correcto sino que también rompe la regla de propiedad. Feliz depuración/fijación de fugas. – JustSid

+0

Creo que esta es la mejor respuesta, agregué más código de muestra en una respuesta más abajo – dancl

3

Esto debe hacerlo:

- (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] debería ser [hex cStringUsingEncoding: NSASCIIStringEncoding] si es hex es ASCII – valexa

-1

Creo que la gente aconsejando initWithFormat es la mejor respuesta, ya que es objetivo-C en lugar de una mezcla de ObjC, C .. (aunque el código de ejemplo es un poco escueto). Hice lo siguiente

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]; 
}