Converting HEX NSString To NSData

I’m trying to convert a Hex NSString to NSData (I’m using the below attached code). The following is the output:

<00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000>

which looks totally irrelevant to me. Any idea/ suggestions on where its going wrong?

  • iOS - Friendly NSDate format
  • how to play live streaming from url for a camera that broadcasting live
  • Record square video using AVFoundation and add watermark
  • FCM - Programatically Send Push Notification To User Segments
  • how to use NSDateFormatter to see “Today” string
  • UIButton does not work when it in UIScrollView
  • 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);    
    

    4 Solutions Collect From Internet About “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
    

    I see several solution have been post only able to convert string with even length.

    So here is my solution which also able return correct data if the string is odd length like this “DBA” became data like this this “\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;
    
    }