2016-12-09 1 views
0

J'ai une chaîne au format Hex ASCII [3x3x3x3x] avec la variable x, x- (0 ... F).Extraction de certaines valeurs hexadécimales d'une chaîne vers une nouvelle chaîne

Par exemple, je peux obtenir des données

inData = 0x30303f3f et que vous voulez convertir en:

outData = 0x00ff

ou

inData = 0x3f3f3f3f

outData = 0xffff

Comment est la meilleure façon de faire des opérations de bits ici, vraiment je veux juste passer les "3"?

// 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
  • temps = 255 (sortie)

Je me demande s'il y a un moyen de faire ce que la boucle for fait-il plus vite, comme avec le décalage de bits ou similaire?

+0

Montrez ce que vous avez essayé. –

+1

La sortie est-elle toujours une chaîne ou voulez-vous l'analyser également? Et autorisez-vous des choses comme '_pext_u32' ou' _mm_shuffle_epi8'? – harold

+0

Cela n'a aucun sens. '0x30303f3f' n'est pas' 0x00ff', et '0x3f3f3f3f' n'est pas' 0xffff' –

Répondre

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

Vous faites référence à des données binaires, par exemple les données d'un fichier binaire, ou les données en mémoire. Ces données peuvent être représentées sous forme de chaîne au format hexadécimal:

#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; 
} 

Le résultat est "30303F3F"

Ou les données peuvent être stockées dans une chaîne, mais ce n'est pas très courant.

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

Résultat: "30313233343536373839"

Notez que 0 est un caractère dont la valeur est 0x30 et 1 est 0x31 etc. Voilà où est tous les trois viennent.