2011-09-06 9 views
33

कनवर्ट करना मैं हेक्स NSString से NSData (मैं नीचे दिए गए कोड का उपयोग कर रहा हूं) को परिवर्तित करने की कोशिश कर रहा हूं। निम्नलिखित आउटपुट है:एचएक्स एनएसएसटींग को एनएसडीटा

<00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000> 

जो मेरे लिए पूरी तरह से अप्रासंगिक दिखता है। किसी भी विचार/सुझाव जहां यह गलत हो रहा है?

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

यह द्वारा जवाब पर आधारित है:

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

की तरह डेटा आप नहीं होना चाहिए strtol करने के लिए 16 पास? –

उत्तर

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

आपको जो आउटपुट मिल रहा है वह क्या है? –

+2

इसके रिटर्न <72ff63ce a198b3ed ba8f7e0c 23acc345 050187a0 cde5a987 2cbab091 ab73e553> –

+0

सही धन्यवाद! –

25

यहाँ एक और तरीका भी इस तरह के

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

संहिता, प्रमुख <> अनुगामी और एम्बेडेड रिक्त स्थान को संभालती है कि है @Nikunj आर जादव

4

यह अधिक उपयोगी हो सकता है, ऐप्पल ने एनएसडीटा श्रेणी साझा की है।

NSData+HexString.m

कोड है:

@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

मैं देख रहा हूँ कई समाधान पोस्ट केवल भी लंबाई के साथ स्ट्रिंग परिवर्तित करने के लिए सक्षम है।

तो यहाँ

मेरी समाधान करता है, तो स्ट्रिंग इस "डीबीए" की तरह अजीब लंबाई है जो भी सक्षम वापसी सही डेटा बन गया यह इस "\ 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; 

} 
संबंधित मुद्दे