2011-09-06 12 views
33

私は16進数NSStringNSData(私は以下のコードを使用しています)に変換しようとしています。出力は次のとおりです。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; 

} 
関連する問題