2011-06-29 11 views
5

Necesito convertir un NSString de valores hexadecimales en un NSString de texto (ASCII). Por ejemplo, necesito algo como:¿Convertir cadena de maleficio en NSString de texto?

"68 65 78 61 64 65 63 69 6d 61 6c" to be "hexadecimal" 

He mirado y ajustado el código en this thread, pero que no funciona para mí. Solo funciona con un par de hex. ¿Algo que ver con los espacios? Cualquier consejo o código de muestra es muy apreciado.

Respuesta

8

Bueno, modificaré la misma cosa para su propósito.

NSString * str = @"68 65 78 61 64 65 63 69 6d 61 6c"; 
NSMutableString * newString = [NSMutableString string]; 

NSArray * components = [str componentsSeparatedByString:@" "]; 
for (NSString * component in components) { 
    int value = 0; 
    sscanf([component cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value); 
    [newString appendFormat:@"%c", (char)value]; 
} 

NSLog(@"%@", newString); 
+0

'[NSMutableString string]' plz ... – jtbandes

+0

@jtbandes Agreeed. :) –

6

Puedes usar un NSScanner para obtener cada caracter. Los espacios serán necesarios para separar cada valor, o el escáner continuará escaneando e ignorará otros datos.

- (NSString *)hexToString:(NSString *)string { 
    NSMutableString * newString = [[NSMutableString alloc] init]; 
    NSScanner *scanner = [[NSScanner alloc] initWithString:string]; 
    unsigned value; 
    while([scanner scanHexInt:&value]) { 
     [newString appendFormat:@"%c",(char)(value & 0xFF)]; 
    } 
    string = [newString copy]; 
    [newString release]; 
    return [string autorelease]; 
} 

// called like: 
NSLog(@"%@",[self hexToString:@"68 65 78 61 64 65 63 69 6d 61 6c"]); 
+0

¿Por qué no solo devuelve newString? –

+0

@Raffi Podría, pero dado que el tipo de devolución es inmutable, prefiero crear primero una copia inmutable. – ughoavgfhw

0

En mi caso, la cadena fuente no tenía separadores, p. '303034393934' Aquí está mi solución.

NSMutableString *_string = [NSMutableString string]; 
for (int i=0;i<12;i+=2) { 
    NSString *charValue = [tagAscii substringWithRange:NSMakeRange(i,2)]; 
    unsigned int _byte; 
    [[NSScanner scannerWithString:charValue] scanHexInt: &_byte]; 
     if (_byte >= 32 && _byte < 127) { 
      [_string appendFormat:@"%c", _byte]; 
      } else { 
      [_string appendFormat:@"[%d]", _byte]; 
      } 
} 
NSLog(@"%@", _string);