Bonsoir,

Je cherche à réaliser un petit convertisseur utilisable depuis l'invite de commande ou un fichier bat.

J'avais déjà eu besoin de convertir un chaîne de char en tableau de bytes et Médinoc m'avait apporté son aide.

Voilà où j'en suis :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <stdlib.h>
 
int ConvertOneHexCharToItsValue(char c)
{
	if (c >= '0' && c <= '9')
		return c - '0';
	else if (c >= 'a' && c <= 'f')
		return c - 'a' + 10;
	else if (c >= 'A' && c <= 'F')
		return c - 'A' + 10;
	else
		return 0;
}
 
unsigned char ConvertTwoHexCharsToByte(char const c[])
{
	int highNibble = ConvertOneHexCharToItsValue(c[0]);
	int lowNibble = ConvertOneHexCharToItsValue(c[1]);
	int ret = (highNibble << 4) | lowNibble;
	return (unsigned char)ret;
}
 
unsigned char *ConvertHexStringToBytes(char const s[])
{
  size_t            cb;
  unsigned char     *pRet = NULL;
 
  cb = strlen(s)/2;
  pRet = malloc(cb);
  if(pRet != NULL)
    {
      size_t i;
      for(i = 0 ; i < cb ; i++)
         pRet[i] = ConvertTwoHexCharsToByte(s+(2*i));
    }
  return pRet;
}
 
int main (int argc, char *argv[])
{
  int                        a;
  int                        i;
  unsigned char              *buffer = NULL;
 
  a = 0;
  i = 0;
  buffer = malloc(1);
  if (argc != 2)
    exit(EXIT_FAILURE);
  while (a != strlen(argv[1]))
    {
      if (argv[1][a] != ' ')
        {
          buffer = realloc(buffer, strlen(buffer)+1);
          buffer[i] = argv[1][a];
          i++;
        }
      a++;
    }
  buffer[i] = '\0';
  buffer = ConvertHexStringToBytes(buffer);
  a = 0;
  while (a != i/2)
    {
      if (buffer[a] != '\0')
        printf("%c", buffer[a]);
      a++;
    }
  printf("\n\n\n");
  return (0);
}
Les deux boucles dans le main ne servent qu'à augmenter les possibilités de format de la chaîne passée via l'invite de commande ( délimiteur entre chaque nombre hexa et format REGEDIT5 ).

Si je fais dans un batch :

Convertisseur "5C 00 72 00 65 00 67 00 69 00 73 00 74 00 72 00 79 00 5C 00 6D 00 61 00 63 00 68 00 69 00 6E 00 65 00 5C 00 73 00 79 00 73 00 74 00 65 00 6D 00 5C 00 63 00 75 00 72 00 72 00 65 00 6E 00 74 00 63 00 6F 00 6E 00 74 00 72 00 6F 00 6C 00 73 00 65 00 74 00 5C 00 73 00 65 00 72 00 76 00 69 00 63 00 65 00 73 00 5C 00 62 00 63 00 71 00 77 00 77 00 68 00 78 00 71 00 00 00"

Le résultat est correct : \registry\machine\system\currentcontrolset\services\bcqwwhxq

Par contre si je mets :

Convertisseur "07 80 CC CC", le programme plante.

Pourtant, j'ai bien spécifié des variables unsigned char, donc je devrais pouvoir convertir les caractères de la table ASCII dont la valeur décimale va de 0 à 255.

Merci pour votre aide.