Converting HEX NSString To NSData Converting HEX NSString To NSData objective-c objective-c

Converting HEX NSString To NSData


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);


Here is another method that also handles leading <, trailing > and embedded spaces such as

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

Code:

+ (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;}

This is based on the answer by @Nikunj R. Jadav


This might be more useful, Apple has shared a NSData category.

NSData+HexString.m

The code is:

@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