2011-09-06 133 views
33

我试图将十六进制NSString转换为NSData(我使用下面的附加代码)。以下是输出:转换HEX NSString到NSData

<00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000> 

这看起来完全不相干我。任何想法/建议哪里出错?

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

数据你不应该将16通过strtol? –

回答

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> 

代码,也负责处理领导<,尾随>和嵌入式空间的另一种方法:

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

这是基于答案@Nikunj R. Jadav

4

这可能更有用,Apple已经共享了一个NSData类别。

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

我看到几个解决方案已经交只能字符串转换甚至长度。

因此,这里是我的解决方案,它也能返回正确的数据,如果该字符串是这样的“DBA”奇长成了这个样子这个“\ 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; 

}