2012-08-08 5 views
0

EDIT1으로있는 NSString을 해석하여있는 NSData를 만듭니다 롭 mayoff'answer는 wonderful.And이 내 자신이다 :16 진수

-(NSData *)change:(NSString *)hexString 
    { 
     int j=0; 
     Byte bytes[[hexString length]]; 
     for(int i=0;i<[hexString length];i++) 
     { 
      int int_ch; 

     unichar hex_char1 = [hexString characterAtIndex:i]; 
     int int_ch1; 
     if(hex_char1 >= '0' && hex_char1 <='9') 
      int_ch1 = (hex_char1-48)*16; 
     else if(hex_char1 >= 'A' && hex_char1 <='F') 
      int_ch1 = (hex_char1-55)*16; 
     else 
      int_ch1 = (hex_char1-87)*16; 
     i++; 

     unichar hex_char2 = [hexString characterAtIndex:i]; 
     int int_ch2; 
     if(hex_char2 >= '0' && hex_char2 <='9') 
      int_ch2 = (hex_char2-48); 
     else if(hex_char1 >= 'A' && hex_char1 <='F') 
      int_ch2 = hex_char2-55; 
     else 
      int_ch2 = hex_char2-87; 

     int_ch = int_ch1+int_ch2; 

     bytes[j] = int_ch; 
     j++; 
    } 
    NSData *newData = [[NSData alloc] initWithBytes:bytes length:[hexString length]/2]; 
    return newData; 
} 

------- 편집 별도 ----- -------------------------------------------

나는 다음과 같은 16 진수의 NSString :

NSString *aString [email protected]“8dfe2f9a9384573fa0ffae17c3bef4cc2ba056cc5cbbfab57ac78c83af4ef8a48ea1728d904e87613845377821e01e07cc6c9dea35516dc595421e0ffc7caa7a19671e713bb74d84d1dd4fb2c972dd8facf5d74ad32662e992ea13d2417abcaee4137098322394ba76badbaf4c1db344704bbf9ed8a1513ff4b2e766526c98a2808b7ae67d1866cb9b489764e70662b1499d8d467a8817d1304aab8f92ebddd3e871cc1374cae96a1428f0c2afcb3f43e705cdd7649bde5a363d59125980d0acbbe32879b96ab15e93f74c08d435b787a8ee734e2773e16ae8f4cb4a5ddad989f92cf1c609f0f8b81fedb67f974ae583548b13c86b6fe1925a33a47cbda8ed54c20f2d8020650ba7fabbf8cbac00493b6de423880ef1a1af8cddc457c064cd6150aa30d34456e422ea707c313c7fbb428ce1c4e534ea8edd8c21b62d526522606e6944c4058e631dafc6f9a539f9a4dfd8afeccef51a8a4904a3efa0a76f3ca55ab56c726b0787d9ebb261ca91f5abbf985096b327a6269399ac11a23cafb0b3a6b3fb4aa357fc1644c89b7dee396c51af734738e598b765b2384eb8931f4b65d9f4b6c73ee3f1f6c5aa17871d14335153e4058ab9bc0fcad35dbdb924d00b0a71b985e20cdf530fa5479e2dd8f14d269ce59da365bac03fccb037963e7e3f175a09dd7efc66e450df5a16e7233ea55009e4891ef238d003d5837f077c12167428ad19d3da45d569aa252d5ffd736e134ad3b5654fd82506822be9b78731c9ca5ee56685153e657e8b385013ff14bbe5a1f5938801e94fe498495c2d94c84a937e1c36a4667a16dfeced471c3902b4b3d1daa9f2c72a09af736ef51ebe39f0006667d60ddc9ec20c5c29cc8933e5fb9e293560db6b1s2df4864bd9cf02b0d40d5b24d0326f1d7e251a0cbc692b68fa37212a57f34588d18d6f4f7e59d997a8c4b5e452fe883645b90bd7ee3a4b38754616ca7a9d430620036dbead2ec03bebb5c69e92f9a33951c22e83e68dd85350c7” 

그리고 NSData를 좋아하는 것으로 변경하고 싶습니다. 예 :

NSData *aData = <8dfe2f9a 9384573f a0ffae17 c3bef4cc 2ba056cc 5cbbfab5 7ac78c83 af4ef8a4 8ea1728d 904e8761 38453778 21e01e07 cc6c9dea 35516dc5 95421e0f fc7caa7a 19671e71 3bb74d84 d1dd4fb2 c972dd8f acf5d74a d32662e9 92ea13d2 417abcae e4137098 322394ba 76badbaf 4c1db344 704bbf9e d8a1513f f4b2e766 526c98a2 808b7ae6 7d1866cb 9b489764 e70662b1 499d8d46 7a8817d1 304aab8f 92ebddd3 e871cc13 74cae96a 1428f0c2 afcb3f43 e705cdd7 649bde5a 363d5912 5980d0ac bbe32879 b96ab15e 93f74c08 d435b787 a8ee734e 2773e16a e8f4cb4a 5ddad989 f92cf1c6 09f0f8b8 1fedb67f 974ae583 548b13c8 6b6fe192 5a33a47c bda8ed54 c20f2d80 20650ba7 fabbf8cb ac00493b 6de42388 0ef1a1af 8cddc457 c064cd61 50aa30d3 4456e422 ea707c31 3c7fbb42 8ce1c4e5 34ea8edd 8c21b62d 52652260 6e6944c4 058e631d afc6f9a5 39f9a4df d8afecce f51a8a49 04a3efa0 a76f3ca5 5ab56c72 6b0787d9 ebb261ca 91f5abbf 985096b3 27a62693 99ac11a2 3cafb0b3 a6b3fb4a a357fc16 44c89b7d ee396c51 af734738 e598b765 b2384eb8 931f4b65 d9f4b6c7 3ee3f1f6 c5aa1787 1d143351 53e4058a b9bc0fca d35dbdb9 24d00b0a 71b985e2 0cdf530f a5479e2d d8f14d26 9ce59da3 65bac03f ccb03796 3e7e3f17 5a09dd7e fc66e450 df5a16e7 233ea550 09e4891e f238d003 d5837f07 7c121674 28ad19d3 da45d569 aa252d5f fd736e13 4ad3b565 4fd82506 822be9b7 8731c9ca 5ee56685 153e657e 8b385013 ff14bbe5 a1f59388 01e94fe4 98495c2d 94c84a93 7e1c36a4 667a16df eced471c 3902b4b3 d1daa9f2 c72a09af 736ef51e be39f000 6667d60d dc9ec20c 5c29cc89 33e5fb9e 293560db 6b152df4 864bd9cf 02b0d40d 5b24d032 6f1d7e25 1a0cbc69 2b68fa37 212a57f3 4588d18d 6f4f7e59 d997a8c4 b5e452fe 883645b9 0bd7ee3a 4b387546 16ca7a9d 43062003 6dbead2e c03bebb5 c69e92f9 a33951c2 2e83e68d d85350c7> 

누군가이 방법을 알려 줄 수 있습니까?

+0

가능한 중복 http://stackoverflow.com/questions/901357/how-do-i-convert-a-nsstring-value-to- nsdata). 또한 데이터가 필요하거나 문자열에 공백이 필요합니까? – CodaFi

답변

5

나는 NSString이 있다고 가정하고 문자열의 문자를 16 진수로 해석하고 그 내용이 16 진수로 표시된 바이트 인 내용을 NSData으로 만듭니다. 나는 당신의 질문을 그렇게 편집하도록 편집했다.

이렇게하는 방법은 다양합니다. 다음은 완벽하게 최적화되지 않았으므로 정상적으로 오류를 처리하지 않는 경우입니다. 그러나 저는 당신의 모범을 시험해 보았습니다.

NSData *dataByIntepretingHexString(NSString *hexString) { 
    char const *chars = hexString.UTF8String; 
    NSUInteger charCount = strlen(chars); 
    if (charCount % 2 != 0) { 
     return nil; 
    } 
    NSUInteger byteCount = charCount/2; 
    uint8_t *bytes = malloc(byteCount); 
    for (int i = 0; i < byteCount; ++i) { 
     unsigned int value; 
     sscanf(chars + i * 2, "%2x", &value); 
     bytes[i] = value; 
    } 
    return [NSData dataWithBytesNoCopy:bytes length:byteCount freeWhenDone:YES]; 
} 
+0

이제 이것이 올바른 대답입니다! – CodaFi

+0

답변 해 주셔서 감사합니다. 도움이됩니다. –

+0

정확히 수행해야 할 작업을 분류하고 논리적으로 실행합니다. 예상 된 결과를 제공합니다. 답변 해주셔서 감사합니다. –

0
-(NSMutableData*)hexDataFromString:(NSString*)string{ 

    NSMutableData *hexData= [[NSMutableData alloc] init]; 
    unsigned char whole_byte; 
    char byte_chars[3] = {'\0','\0','\0'}; 
    int i; 
    for (i=0; i < [string length]/2; i++) { 
     byte_chars[0] = [string characterAtIndex:i*2]; 
     byte_chars[1] = [string characterAtIndex:i*2+1]; 
     whole_byte = strtol(byte_chars, NULL, 16); 
     [hexData appendBytes:&whole_byte length:1]; 
    } 
    return hexData; 
} 
0

허용 대답, 충분히 생각을 시연하는 동안. sscanf로 인한 성능 문제로 어려움을 겪을 수 있습니다. 다른 대답은 아마 upvoted해야합니다. 다음은 도움이 될 수 있지만 조작 된 데이터는 확인하지 않습니다.

+(uint8_t)hexCharacterValue:(unichar)hexChar{ 
    if(hexChar > 0x60) return (hexChar - 0x57); 
    if(hexChar > 0x40) return (hexChar - 0x37); 
    return (hexChar - 0x30); 
} 

+(NSData*)dataWithOctetString:(NSString*)string{ 
    NSUInteger byteCount = [string length]/2; 
    uint8_t* bytes = (uint8_t*) malloc(byteCount*sizeof(uint8_t)); 
    for(NSUInteger j = 0, i=0; j<[string length]; j+=2,i++) bytes[i] = ([[self class] hexValue:[string characterAtIndex:j]] << 4) | [[self class] hexValue:[string characterAtIndex:j+1]]; 
    return [NSData dataWithBytesNoCopy:bytes length:byteCount freeWhenDone:YES]; 
} 
[I가있는 NSData에있는 NSString 값을 변환하려면 어떻게?]의 (