2010-05-18 10 views
2

J'ai trouvé beaucoup de solutions différentes à ce problème, mais toutes ne fonctionnent pas, et beaucoup d'entre elles semblent un peu hacky et inefficaces. Fondamentalement, j'ai une chaîne de données hexadécimales (c'est-à-dire "55 AA 41 2A 00 94 55 AA BB BB 00 FF") que je voudrais convertir en données brutes. Quelle est la meilleure façon de procéder? La solution de Vicky a très bien fonctionné pour moi, mais j'ai changé pour travailler avec des chaînes hexadécimales qui n'ont pas d'espace entre les deux et qui a un peu changé le style.Convertir une chaîne hexadécimale en données

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

Pourriez-vous préciser, peu de temps, les quelques approches que vous avez essayé et dans quel type de contexte ce code devrait en forme? – nielsj

+5

(Peut-être pas le meilleur, mais le plus court à coup sûr;) duplicata possible de [Code golf - hexadécimal à la conversion binaire (brut)] (http://stackoverflow.com/questions/795027/code-golf-hex-to-raw -binary-conversion) – zaf

+0

zaf, c'est exactement ce que je voulais, désolé je n'ai pas vu ça avant. Je suppose que cela serait en quelque sorte un doublon de cela. – AriX

Répondre

2

La chaîne a-t-elle toujours la même longueur?

Si oui:

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]); 

Dans le cas contraire:

#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

A fait du bon travail :) – AriX

+0

Le spécificateur de conversion '% 02x' nécessite un pointeur sur' unsigned int', mais vous lui passez un pointeur sur 'unsigned char'. Il en résulte un comportement indéfini (dans la pratique, votre réponse produira des résultats incorrects sur des machines qui ne sont pas little-endian, et tombera sur des machines avec des exigences d'alignement strictes). – caf

+0

@caf: Bien repéré. Je vais éditer. – Vicky

1

Avez-vous essayé sscanf ou scanf? Cette fonction traite les valeurs hexadécimales et retourne des "données brutes".

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