2011-09-06 23 views
33

Estoy tratando de convertir un Hex NSString en NSData (estoy usando el siguiente código adjunto). El siguiente es el resultado:Convirtiendo HEX NSString a NSData

<00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000> 

que me parece totalmente irrelevante. ¿Alguna idea/sugerencia sobre dónde está yendo mal?

NSString *strData = @"72ff63cea198b3edba8f7e0c23acc345050187a0cde5a9872cbab091ab73e553"; 

NSLog(@"string Data length is %d",[strData length]); 

NSMutableData *commandToSend= [[NSMutableData alloc] init]; 
unsigned char whole_byte; 
char byte_chars[2]; 
int i; 
for (i=0; i < [strData length]/2; i++) { 

    byte_chars[0] = [strData characterAtIndex:i*2]; 
    byte_chars[1] = [strData characterAtIndex:i*2+1]; 
    whole_byte = strtol(byte_chars, NULL, [strData length]); 
    [commandToSend appendBytes:&whole_byte length:1]; 
} 
NSLog(@"%@", commandToSend);  
+0

No deberías pasar 16 a strtol? –

Respuesta

63
NSString *command = @"72ff63cea198b3edba8f7e0c23acc345050187a0cde5a9872cbab091ab73e553"; 

command = [command stringByReplacingOccurrencesOfString:@" " withString:@""]; 
NSMutableData *commandToSend= [[NSMutableData alloc] init]; 
unsigned char whole_byte; 
char byte_chars[3] = {'\0','\0','\0'}; 
int i; 
for (i=0; i < [command length]/2; i++) { 
    byte_chars[0] = [command characterAtIndex:i*2]; 
    byte_chars[1] = [command characterAtIndex:i*2+1]; 
    whole_byte = strtol(byte_chars, NULL, 16); 
    [commandToSend appendBytes:&whole_byte length:1]; 
} 
NSLog(@"%@", commandToSend); 
+1

¿cuál es el resultado que obtendrás? –

+2

sus devoluciones <72ff63ce a198b3ed ba8f7e0c 23acc345 050187a0 cde5a987 2cbab091 ab73e553> –

+0

gracias perfectos! –

25

Aquí hay otro método que también se ocupa de líder <, arrastrando > y espacios incrustados como

<9dc69faf a7434ba9 aef57f5c 365d571f 4c3753c4 ae13db42 57d184ca e00246c5> 

Código:

+ (NSData *)dataFromHexString:(NSString *)string 
{ 
    string = [string lowercaseString]; 
    NSMutableData *data= [NSMutableData new]; 
    unsigned char whole_byte; 
    char byte_chars[3] = {'\0','\0','\0'}; 
    int i = 0; 
    int length = string.length; 
    while (i < length-1) { 
     char c = [string characterAtIndex:i++]; 
     if (c < '0' || (c > '9' && c < 'a') || c > 'f') 
      continue; 
     byte_chars[0] = c; 
     byte_chars[1] = [string characterAtIndex:i++]; 
     whole_byte = strtol(byte_chars, NULL, 16); 
     [data appendBytes:&whole_byte length:1]; 
    } 
    return data; 
} 

Esto se basa en la respuesta por @Nikunj R. Jadav

4

Esto podría ser más útil, Apple ha compartido una categoría NSData.

NSData+HexString.m

El código es:

@implementation NSData (HexString) 

// Not efficent 
+(id)dataWithHexString:(NSString *)hex 
{ 
    char buf[3]; 
    buf[2] = '\0'; 
    NSAssert(0 == [hex length] % 2, @"Hex strings should have an even number of digits (%@)", hex); 
    unsigned char *bytes = malloc([hex length]/2); 
    unsigned char *bp = bytes; 
    for (CFIndex i = 0; i < [hex length]; i += 2) { 
     buf[0] = [hex characterAtIndex:i]; 
     buf[1] = [hex characterAtIndex:i+1]; 
     char *b2 = NULL; 
     *bp++ = strtol(buf, &b2, 16); 
     NSAssert(b2 == buf + 2, @"String should be all hex digits: %@ (bad digit around %d)", hex, i); 
    } 

    return [NSData dataWithBytesNoCopy:bytes length:[hex length]/2 freeWhenDone:YES]; 
} 

@end 
0

veo varios solución sido puesto sólo es capaz de convertir la cadena con longitud par.

Así que aquí es mi solución que también retorno de datos correctos capaces si la cadena es longitud impar como este "DBA" se convirtió en datos como estos este "\ x0D \ XBA"

+ (NSData *)dataFromHexString:(NSString *) string { 
    if([string length] % 2 == 1){ 
     string = [@"0"stringByAppendingString:string]; 
    } 

    const char *chars = [string UTF8String]; 
    int i = 0, len = (int)[string length]; 

    NSMutableData *data = [NSMutableData dataWithCapacity:len/2]; 
    char byteChars[3] = {'\0','\0','\0'}; 
    unsigned long wholeByte; 

    while (i < len) { 
     byteChars[0] = chars[i++]; 
     byteChars[1] = chars[i++]; 
     wholeByte = strtoul(byteChars, NULL, 16); 
     [data appendBytes:&wholeByte length:1]; 
    } 
    return data; 

}