4 votes

Assignation HEX en C

J'ai généré une longue séquence d'octets qui se présente comme suit :

0x401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F.....

Maintenant, je voudrais l'affecter à un static unsigned char x[].

Évidemment, j'obtiens l'avertissement que la séquence d'échappement hexagonale est hors de portée lorsque je fais ceci ici.

static unsigned char x[] = "\x401DA1815EB56039.....";

Le format dont il a besoin est le suivant

static unsigned char x[] = "\x40\x1D\xA1\x81\x5E\xB5\x60\x39.....";

Je me demande donc s'il existe en C un moyen de réaliser cette tâche sans que je doive ajouter la séquence d'échappement hexagonale après chaque octet (ce qui pourrait prendre un certain temps).

7voto

strager Points 41713

Je ne pense pas qu'il y ait un moyen d'en faire une littérature.

Vous pouvez analyser la chaîne au moment de l'exécution et la stocker dans un autre tableau.

Vous pouvez utiliser sed ou autre pour réécrire la séquence :

echo 401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F | sed -e 's/../\\x&/g'
\x40\x1D\xA1\x81\x5E\xB5\x60\x39\x9F\xE3\x65\xDA\x23\xAA\xC0\x75\x7F\x1D\x61\xEC\x10\x83\x9D\x9B\x55\x21F

4voto

KennyTM Points 232647

AFAIK, non.

Mais vous pouvez utiliser le regex s/(..)/\\x$1/g pour convertir votre séquence au dernier format.

2voto

Non, il n'y a aucun moyen de faire cela en C ou C++. La solution la plus évidente est d'écrire un programme qui insère le ' \x au bon endroit dans la chaîne. Cette tâche conviendrait à un langage de script comme perl, mais vous pouvez aussi facilement le faire en C ou C++.

2voto

SF. Points 4242

Si la séquence est fixée, je suggère de suivre la suggestion de regexp-in-editor.

Si la séquence change dynamiquement, vous pouvez relativement facilement la convertir au moment de l'exécution.

char in[]="0x401DA1815EB560399FE365DA23AAC0757F1D61EC10839D9B5521F..."; //or whatever, loaded from a file or such.

char out[MAX_LEN]; //or malloc() as l/2 or whatever...

int l = strlen(in);
for(int i=2;i<l;i+=2)
{
    out[i/2-1]=16*AsciiAsHex(in[i])+AsciiAsHex(in[i]+1);
}
out[i/2-1]='\0';
...

int AsciiAsHex(char in)
{
   if(in>='0' && in<='9') return in-'0';
   if(in>='A' && in<='F') return in+10-'A';
   if(in>='a' && in<='f') return in+10-'a';
   return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X