IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Convertisseur hexa->ascii en ligne de commande


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut Convertisseur hexa->ascii en ligne de commande
    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.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    À vue de nez, deux petites choses :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    unsigned char *ConvertHexStringToBytes(char const s[])
    {
      size_t            cb;
      unsigned char     *pRet = NULL;
     
      cb = strlen(s)/2;
     
        …
      return pRet;
    }

    Il faut aussi que tu prévoies dans ton buffer de destination une place pour le '\0' final. Donc « strlen(s)/2+1 », et placer le '\0' manuellement en fin de fonction comme tu le fais ailleurs, dans ton programme.

    Code C : 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
    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);
        …

    Là encore, tu fais un strlen() sur un buffer fraîchement alloué mais pas initialisé. Le comportement est indéterminé : S'il y a un zéro qui traîne dedans par accident et qu'il apparaît suffisamment tôt, le programme fonctionnera, sinon il plantera avec une segfault.

    ÉDIT :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer = ConvertHexStringToBytes(buffer);

    Ça aussi, c'est mauvais en C (mauvaise habitude du Java ?). « buffer » est un pointeur vers de la mémoire que tu as allouée. Si tu remplaces son contenu sans désallouer ce sur quoi il pointait, tu n'auras plus jamais moyen de le faire. → Fuite de mémoire.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Bonjour Obsidian,

    Merci pour ta réponse.

    Il faut aussi que tu prévoies dans ton buffer de destination une place pour le '\0' final. Donc « strlen(s)/2+1 », et placer le '\0' manuellement en fin de fonction comme tu le fais ailleurs, dans ton programme.
    Oui, mais ce n'est pas vraiment indispensable vu la manière dont je lis le buffer après, mais bon, ça ne coûte rien et c'est une bonne habitude à prendre.

    Là encore, tu fais un strlen() sur un buffer fraîchement alloué mais pas initialisé. Le comportement est indéterminé : S'il y a un zéro qui traîne dedans par accident et qu'il apparaît suffisamment tôt, le programme fonctionnera, sinon il plantera avec une segfault.
    Ah vi... en effet, j'ai rectifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    buffer = malloc(1);
    buffer[0] = '\0';
    Ça aussi, c'est mauvais en C (mauvaise habitude du Java ?). « buffer » est un pointeur vers de la mémoire que tu as allouée. Si tu remplaces son contenu sans désallouer ce sur quoi il pointait, tu n'auras plus jamais moyen de le faire. → Fuite de mémoire.
    Nop, le C est mon premier langage, donc oubli de débutant on va dire

    J'ai découvert que ça marchait impec' sous XP, on dirait un problème de console visiblement.

    Voici le lien vers l'exécutable si certains veulent tester et me dire ce qu'ils en pensent :

    http://www.sendspace.com/file/2etez1


  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    Citation Envoyé par Merillym Voir le message
    Oui, mais ce n'est pas vraiment indispensable vu la manière dont je lis le buffer après, mais bon, ça ne coûte rien et c'est une bonne habitude à prendre.
    Oui, ce n'est pas nécessaire à chaque fois non plus, effectivement. J'avais fait la remarque parce qu'il me semblait que tu utilisais strlen() un peu plus loin, à son issue. Confusion induite par le fait que tu utilisais deux fois la variable « buffer ».

    J'ai découvert que ça marchait impec' sous XP, on dirait un problème de console visiblement.
    Commme dit plus haut, il est probable que ton programme initial soit « tombé en marche ». La lecture d'une mémoire tampon non initialisée engendre des résultats indéfinis.

    Je n'utilise pas Windows, et soumettre un exécutable est rarement une bonne idée. Poste plutôt ici le code que tu as corrigé. Là, on sera à même de te dire si ça va fonctionner tout le temps et partout.

    Bon courage.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Re,

    Oki voici l'intégralité du code actuel, si tu peux me dire ce qui ne va pas, je suis preneur. Si quelqu'un peut aussi me faire des remarques d'ordre plus générale sur "ma façon de coder", ce que je pourrais améliorer, je suis preneur :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    /* Egwene/Merillym 2010 
    Merci à Médinoc pour son aide initiale concernant les fonctions de conversation */
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void EgConvInfos(void)
    {
      printf("EgConv version 1.0 by Egwene 2010.\n\n");
      printf("EGCONV Operation [Parameters]\n");
      printf("  Operation = ASCII | HEXA\n\n");
      printf("Return Code: \n\n\t0 - Successful\n\t1 - Failed\n\n");
      printf("To get help on a specific action:\n\n  EGCONV Action /?\n\n");
      printf("Examples :\n");
      printf("  EgwReg ASCII /?\n  EgwReg HEXA /?\n\n");
      printf("\t\t\t\tDisclaimer\n");
      printf("   The writter of this tool isn't liable for damages of any kind arising from\n\t\t\tthe use of this program.\n\n");
    }
     
    void EgConvInfASCII(void)
    {
      printf("EgConv version 1.0 by Egwene 2010.\n\n");
      printf("EgConv ASCII /? :\n\n");
      printf("EGCONV ASCII HexaString [[/nt4-5:hex1-2] [/nt4:hex7] [/nt5:hex7]]\n");
      printf("                         [/Separator]\n\n");
      printf("  HexaString : hexa string to convert in ascii\n");
      printf("  Type : specifie conversion type\n");
      printf("  \t/nt4-5:hex1-2 : Use this switch to convert an HexaString\n");
      printf("  \t                in REG_SZ or REG_EXPAND_SZ format. You can\n");
      printf("  \t                enter HexaString in REGEDIT4 ou REGEDIT5 syntaxe.\n");
      printf("  \t/nt4:hex7 : Use this switch to convert an HexaString in REG_MULTI_SZ\n");
      printf("  \t            format with REGEDIT4 syntaxe.\n");
      printf("  \t/nt5:hex7 : Use this switch to convert an HexaString in REG_MULTI_SZ\n");
      printf("  \t            format with REGEDIT5 syntaxe.\n");
      printf("  Separator : a separator between each hexa number\n\n");
      printf("Notes :\n");
      printf("   1) Hexa string must NOT be terminated by any '00' hexa number.\n");
      printf("   2) Separator can only be a single character.\n\n");
      printf("\t\t\t\tDisclaimer\n");
      printf("   The writter of this tool isn't liable for damages of any kind arising from\n\t\t\tthe use of this program.\n\n");
      exit(EXIT_SUCCESS);
    }
     
    void EgConvInfHEXA(void)
    {
      printf("EgConv version 1.0 by Egwene 2010.\n\n");
      printf("EgConv HEXA /? :\n\n");
      printf("EGCONV HEXA UcharString [[/nt4:hex1] [/nt5:hex2] [/nt4:hex7] [/nt5:hex7]]\n\n");
      printf("  UcharString : string to convert in hexa\n");
      printf("  Type : specifie conversion type\n");
      printf("  \t/nt4:hex2 : Convert in REG_EXPAND_SZ format with REGEDIT4 syntaxe\n");
      printf("  \t/nt5:hex2 : Convert in REG_EXPAND_SZ format with REGEDIT5 syntaxe\n");
      printf("  \t/nt4:hex7 : Convert in REG_MULTI_SZ format with REGEDIT4 syntaxe\n");
      printf("  \t/nt4:hex7 : Convert in REG_MULTI_SZ format with REGEDIT5 syntaxe\n\n");
      printf("Notes :\n");
      printf("   1) To convert in REG_SZ format, please use /nt[4 | 5]:hex2 switch.\n");
      printf("   1) To convert in REG_MULTI_SZ format, please use '*' like separator.\n\n");
      printf("\t\t\t\tDisclaimer\n");
      printf("   The writter of this tool isn't liable for damages of any kind arising from\n\t\t\tthe use of this program.\n\n");
      exit(EXIT_SUCCESS);
    }
     
    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[])
    {
      int               cb;
      int               i;
      unsigned char     *pRet = NULL;
     
      cb = strlen(s)/2;
      if ((pRet = malloc(cb+1)) == NULL)
        exit(EXIT_FAILURE);
      for(i = 0 ; i < cb ; i++)
        pRet[i] = ConvertTwoHexCharsToByte(s+(2*i));
      pRet[cb] = '\0';
      return pRet;
    }
     
    int compare_ch(char str1[], char str2[])
    {
      int     i;
      int     j;
     
      i = 0;
      j = 0;
      if (str1 == NULL || str2 == NULL)
          return(1);
      if ((strlen(str1) == strlen(str2)) && str1 != NULL && str2 != NULL)
        {
          while (i < strlen(str1))
            {
              if (str1[i] != str2[j] && str1[i] != str2[j]+32 && str1[i] != str2[j]-32)
                return(1);
              j++;
              i++;
            }
            return(0);
        }
      return(1);
    }
     
    int main (int argc, char *argv[])
    {
      int                        a;
      int                        i;
      size_t                     n;
      unsigned char              *buffer;
     
      a = 0;
      i = 0;
      if (argc < 2 && argc > 5)
        exit(EXIT_FAILURE);
      if (compare_ch(argv[1], "/?") == 0)
        {
          EgConvInfos();
          exit(EXIT_SUCCESS);
        }
      if (compare_ch(argv[1], "ASCII") == 0 && compare_ch(argv[2], "/?") == 0)
        {
          EgConvInfASCII();
          exit(EXIT_SUCCESS);
        }
      if (compare_ch(argv[1], "HEXA") == 0 && compare_ch(argv[2], "/?") == 0)
        {
          EgConvInfHEXA();
          exit(EXIT_SUCCESS);
        }
      n = strlen(argv[2]);
      buffer = malloc(1);
      buffer[0] = '\0';
      if (compare_ch(argv[1], "ASCII") == 0)
        {
          if (argv[4])
            {
              if (strlen(argv[4]) != 2)
                {
                  printf("Invalid parameters...\n");
                  EgConvInfos();
                  exit(EXIT_FAILURE);
                }
              while (a != strlen(argv[2]))
                {
                  if (argv[2][a] != argv[4][1])
                    {
                      buffer = realloc(buffer, strlen(buffer)+1);
                      buffer[i] = argv[2][a];
                      i++;
                    }
                  a++;
                }
              buffer[i] = '\0';
              buffer = ConvertHexStringToBytes(buffer);
     
              if (compare_ch(argv[3], "/nt4-5:hex1-2") == 0)
                {
                  a = 0;
                  while (a != i/2)
                    {
                      if (buffer[a] != '\0')
                        printf("%c", buffer[a]);
                      a++;
                    }
                  printf("\n");
                }
              if (compare_ch(argv[3], "/nt4:hex7") == 0)
                {
                  a = 0;
                  while (a != i/2)
                    {
                      if (buffer[a] != '\0')
                        printf("%c", buffer[a]);
                      else
                        printf("\n");
                      a++;
                    }
                  printf("\n");
                }
              if (compare_ch(argv[3], "/nt5:hex7") == 0)
                {
                  a = 0;
                  while (a != i/2)
                    {
                      if (buffer[a] == '\0' && buffer[a+1] == '\0' && buffer[a+2] == '\0')
                        {
                          printf("\n");
                          a++;a++;
                        }
                      else
                        {
                          if (buffer[a] != '\0')
                            printf("%c", buffer[a]);
                        }
                      a++;
                    }
                  printf("\n");
                }
     
            }
        }
      else if (compare_ch(argv[1], "HEXA") == 0)
        {
          if (compare_ch(argv[3], "/nt4:hex2") == 0)
            {
              a = 0;
              i = 0;
              while (i != strlen(argv[2])-1)
                {
                  a++;
                  if (a == 24)
                    {
                      printf("%02x,\\\n  ", argv[2][i]);
                      a = 0;
                    }
                  else
                    printf("%02x,", argv[2][i]);
                  i++;
                }
              printf("%02x,00\n  ", argv[2][i]);
            }
          if (compare_ch(argv[3], "/nt4:hex7") == 0)
            {
              a = 0;
              i = 0;
              while (i != strlen(argv[2])-1)
                {
                  a++;
                  if (a == 24)
                    {
                      if (argv[2][i] == '*')
                        {
                          printf("00,\\\n");
                          i++;
                          continue;
                        }
                      printf("%02x,\\\n  ", argv[2][i]);
                      a = 0;
                    }
                  else
                    {
                      if (argv[2][i] == '*')
                        {
                          printf("00,");
                          i++;
                          continue;
                        }
                      printf("%02x,", argv[2][i]);
                    }
                  i++;
                }
              printf("%02x,00,00\n  ", argv[2][i]);
            }
          if (compare_ch(argv[3], "/nt5:hex2") == 0)
            {
              a = 0;
              i = 0;
              while (i != strlen(argv[2])-1)
                {
                  a++;
                  if (a == 12)
                    {
                      printf("%02x,00,\\\n  ", argv[2][i]);
                      a = 0;
                    }
                  else
                    printf("%02x,00,", argv[2][i]);
                  i++;
                }
              printf("%02x,00,00,00\n  ", argv[2][i]);
            }
          if (compare_ch(argv[3], "/nt5:hex7") == 0)
            {
              a = 0;
              i = 0;
              while (i != strlen(argv[2])-1)
                {
                  a++;
                  if (a == 12)
                    {
                      printf("\\\n  ");
                      a = 0;
                    }
                  if (argv[2][i] == '*')
                    {
                      printf("00,00,");
                      i++;
                      continue;
                    }
                  printf("%02x,00,", argv[2][i]);
                  i++;
                }
              printf("%02x,00,00,00,00,00\n  ", argv[2][i]);
            }
        }
      else
        {
          printf("Invalid parameters...\n");
          EgConvInfos();
          exit(EXIT_FAILURE);
        }
      free(buffer);
      buffer = NULL;
      return (0);
    }
    Edit:

    Ça aussi, c'est mauvais en C (mauvaise habitude du Java ?). « buffer » est un pointeur vers de la mémoire que tu as allouée. Si tu remplaces son contenu sans désallouer ce sur quoi il pointait, tu n'auras plus jamais moyen de le faire. → Fuite de mémoire.
    Je n'ai pas encore ajusté le code pour prendre en compte cette remarque, je vais le faire.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Bonjour,
    Dommage que je n'ai pas vu le thread plus tôt. Je contredis totalement l'histoire de mettre un zéro terminal dans le buffer de sortie: LE BUFFER DE SORTIE N'EST PAS UNE CHAÎNE DE CARACTÈRES!

    Il ne faut pas le traiter comme tel, car il peut lui-même contenir des octets nuls au beau milieu. Il s'agit de données brutes, c'est pourquoi le type de retour est unsigned char * et non char *.

    Par là même, je confirme ce qu'a dit Obsidian, ce fragment de code est une abomination:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer = ConvertHexStringToBytes(buffer);
    Qui peut se traduire ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    torchon = CreerServietteAvecMemeMotif(torchon);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Convertisseur hexa - ascii
    Par lowno dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/10/2013, 12h55
  2. Comment compiler un projet en ligne de commande ?
    Par mathieutlse dans le forum EDI
    Réponses: 3
    Dernier message: 11/07/2003, 13h32
  3. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  4. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01
  5. Analyser la ligne de commande
    Par benj29 dans le forum C
    Réponses: 14
    Dernier message: 19/11/2002, 04h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo