2010-05-18 6 views
2

이 문제에 대한 여러 가지 해결책을 찾았지만 그 중 일부는 작동하지 않으며, 많은 부분이 다소 해킹되고 비효율적으로 보입니다. 기본적으로 원시 데이터로 변환하고자하는 16 진수 문자열 (예 : "55AA 41 2A 00 94 55AA BB BB 00 FF")이 있습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?16 진수 문자열을 데이터로 변환

업데이트 : : Vicky의 솔루션은 저에게 효과적 이었지만, 중간에 공백이없고 스타일을 약간 변경 한 16 진수 문자열로 작동하도록 변경했습니다.

int i = 0; 
char *hexString = "55AA412A009455AABBBB00FF" 
char *hexPtr = hexString; 
unsigned int *result = calloc(strlen(hexString)/2 + 1, sizeof *result); 

while (sscanf(hexPtr, "%02x", &result[i++])) { 
    hexPtr += 2; 
    if (hexPtr >= hexString + strlen(hexString)) break; 
} 

return result; 
+0

당신이 명확히 수, 곧, 몇 가지 방법에 당신은 시도하고 컨텍스트의 유형이 코드에서해야 적당한? – nielsj

+5

(아마도 가장 좋지는 않지만 가장 짧은 것은 아닙니다.) [code golf - hex에서 (raw) 이진 변환] 가능한 복제본 (http://stackoverflow.com/questions/795027/code-golf-hex-to-raw - 이진 변환) – zaf

+0

zaf, 정확히 내가 원했던 것입니다. 나는 이것이 어떤면에서 그것의 중복이 될 것이라고 생각한다. – AriX

답변

2

문자열은 항상 길이가 같습니까?

그렇다면 :

char *buf = "55 AA 41 2A 00 94 55 AA BB BB 00 FF"; 
sscanf(buf, "%x %x %x [repeat as many times as necessary]", &a, &b, &c [etc]); 

그렇지 않은 경우 :

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main (int argc, char ** argv) 
{ 
    char *buf = "55 AA 41 2A 00 94 55 AA BB BB 00 FF"; 
    char *p = buf; 
    int i = 0, j; 
    unsigned int *result = calloc(strlen(buf)/3 + 1 * sizeof(int), 1); 

    if (result) 
    { 
     while (sscanf(p, "%02x", &result[i++])) 
     { 
      p += 3; 
      if (p > buf + strlen(buf)) 
      { 
      break; 
      } 
     } 

     printf("%s\n", buf); 

     for (j = 0; j < i; j++) 
     { 
      printf("%02X ", result[j]); 
     } 

     printf("\n"); 
    } 
} 
+0

는 '% 02x' 변환 지정자가 서명 int''에 대한 포인터를 필요로 :) – AriX

+0

좋은 일했다,하지만 당신은 그것을 서명 char''에 대한 포인터를 전달한다. 결과적으로 정의되지 않은 동작이 발생합니다 (실제적으로 리틀 엔디안이 아닌 시스템에서는 잘못된 결과가 발생하고 정렬 요구 사항이 엄격한 시스템에서는 오류가 발생합니다). – caf

+0

@caf : 잘 발견되었습니다. 나는 편집 할 것이다. – Vicky

1

당신은 sscanf 또는 scanf 시도 했습니까? 이 함수는 16 진수 값을 처리하고 "원시 데이터"를 반환합니다.

0
#define GETBITS(a) (a < 'A' ? a - '0' : toupper(a) - 'A' + 10) 

char *cur; 
char data; 
for (cur = buffer; *cur; cur++) { 
    data = GETBITS(cur[0]) << 4 + GETBITS(cur[1]); 
    cur += 2; 
    printf("%c", data); 
} 
printf("\n"); 
0
while(input[i]!='\0'){   
    *(temp++) = ((input[i]>='0' && input[i]<='9')?(input[i]-'0'):(input[i]-'a'+10))*16 +((input[i+1]>='0' && input[i]<='9')?(input[i+1]-'0'):(input[i+1]-'a'+10)); 
     i+=2; 
} 
관련 문제