2016-12-09 1 views
0

변수 x, x- (0 ... F)가있는 16 진수 ASCII 형식 [3x3x3x3x]의 문자열이 있습니다. 예를 들어 나는문자열에서 새로운 문자열로 특정 16 진수 값 추출

데이터

inData = 0x30303f3f

솜씨로 변환 할 수 있습니다

outData = 0x00ff

또는

inData = 0x3f3f3f3f

outData = 0xffff

,536,

여기서 비트 연산을 수행하는 가장 좋은 방법은 무엇입니까? 실제로 "3s"를 건너 뛰고 싶습니다.

// receive answer from device 
if (ReceiveMsg(FLog, TLog::INFO, FSerial, &ReceiveStr)) 
{ 
    int side; 
    char inData[4]; 
    char serial[6]; 
    char status; 

    if (sscanf(ReceiveStr.GetData(), "\x2%6s\x84%1d%4c%c", &serial, &side, &inData, &status) == 4) { 

     *Status = status & 0x0f; 

     // decode hex ASCII 
     int time = 0; 
     int j = 0; 
     for (int i = 3; i >= 0; i--) { 
      time = time + ((inData[i] & 0x0f) *(pow(16, j))); 
      j++; 
     } 
     *Timer = time; 
     result = true; 
    } 
} 
  • inData의 [4] = 0x30에,는 0x30, 0x3F입니다, 0x3F입니다
  • 시간 무엇을위한 루프를 수행 할 수있는 방법이 있다면 = 255 (출력) 궁금

비트 쉬프트 또는 이와 유사하게 더 빠르게 수행 할 수 있습니까?

+0

시도한 것을 보여주십시오. –

+1

출력은 여전히 ​​문자열입니까, 아니면 구문 분석할까요? '_pext_u32' 또는'_mm_shuffle_epi8' 같은 것을 허용합니까? – harold

+0

그건 말이 안됩니다. '0x30303f3f'는'0x00ff'이 아니며'0x3f3f3f3f'는'0xffff'가 아닙니다 –

답변

0
char inData[] = "0x30303f3f"; 
char outData[7] = "0x"; 
outData[2] = inData[3]; 
outData[3] = inData[5]; 
outData[4] = inData[7]; 
outData[5] = inData[9]; 
0
final_result=source<<4 & 0xf0000000+source<<8 & 0x0f000000+source<<12 & 0x00f00000+source<<16 & 0x000f0000 ; 
final_result>>=16; 
0

당신은 메모리에 예를 들어, 이진 파일의 데이터 또는 데이터에 대한 바이너리 데이터를 참조한다. 이 데이터는 16 진수 문자열로 표현 될 수 있습니다

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

int main() 
{ 
    unsigned char data[] = { 0x30, 0x30, 0x3F, 0x3F }; 
    int data_size = sizeof(data)/sizeof(data[0]); 

    char *str = malloc(data_size * 2 + 1); 
    int i; 
    for(i = 0; i < data_size; i++) 
     sprintf(&str[i * 2], "%02X", data[i]); 
    str[i * 2] = 0; 
    printf("%s\n", str); 
    return 0; 
} 

결과 "30303F3F"

또는 데이터가 문자열에 저장 될 수 있지만, 그것은 매우 일반적인 아니에요.

int main() 
{ 
    const char *data = ""; 
    int data_size = strlen(data); 

    char *str = malloc(data_size * 2 + 1); 
    int i; 
    for(i = 0; i < data_size; i++) 
     sprintf(&str[i * 2], "%02X", data[i]); 
    str[i * 2] = 0; 
    printf("%s\n", str); 

    return 0; 
} 

결과 : 0이 값이 0x30 않은 문자이며, 1가 있다는 등 0x31입니다 "30313233343536373839"

하는 것으로 여기서 모든 3의에서 왔습니다.