web-dev-qa-db-fra.com

Conversion de caractère ascii [] en caractère hexadécimal [] en C

J'essaye de convertir un caractère [] dans ASCII en caractère [] en hexadécimal.

Quelque chose comme ça:

bonjour -> 68656C6C6F

Je veux lire au clavier la chaîne. Il doit comporter 16 caractères.

Ceci est mon code maintenant. Je ne sais pas comment faire cette opération. J'ai lu sur strol mais je pense que cela convertit simplement str nombre en int hex ...

#include <stdio.h>
main()
{
    int i = 0;
    char Word[17];

    printf("Intro Word:");

    fgets(Word, 16, stdin);
    Word[16] = '\0';
    for(i = 0; i<16; i++){
        printf("%c",Word[i]);
    }
 }

J'utilise fgets car je lis mieux que fgets mais je peux le changer si nécessaire.

En rapport avec cela, j'essaie de convertir la chaîne lue dans un tableau uint8_t, en joignant chaque 2 octets sur un pour obtenir le nombre hexadécimal.

J'ai cette fonction que j'utilise beaucoup dans Arduino, donc je pense que cela devrait fonctionner sans problème dans un programme C normal.

uint8_t* hex_decode(char *in, size_t len, uint8_t *out)
{
    unsigned int i, t, hn, ln;

    for (t = 0,i = 0; i < len; i+=2,++t) {

            hn = in[i] > '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0';
            ln = in[i+1] > '9' ? (in[i+1]|32) - 'a' + 10 : in[i+1] - '0';

            out[t] = (hn << 4 ) | ln;
            printf("%s",out[t]);
    }
    return out;

}

Mais, chaque fois que j'appelle cette fonction dans mon code, j'obtiens une erreur de segmentation.

Ajout de ce code au code de la première réponse:

    uint8_t* out;
    hex_decode(key_DM, sizeof(out_key), out);

J'ai essayé de passer tous les paramètres nécessaires et d'entrer dans le tableau ce dont j'avais besoin, mais cela a échoué ...

14
Biribu
#include <stdio.h>
#include <string.h>

int main(void){
    char Word[17], outword[33];//17:16+1, 33:16*2+1
    int i, len;

    printf("Intro Word:");
    fgets(Word, sizeof(Word), stdin);
    len = strlen(Word);
    if(Word[len-1]=='\n')
        Word[--len] = '\0';

    for(i = 0; i<len; i++){
        sprintf(outword+i*2, "%02X", Word[i]);
    }
    printf("%s\n", outword);
    return 0;
}
11
BLUEPIXY

remplacez ceci

printf("%c",Word[i]);

par

printf("%02X",Word[i]);
5
MOHAMED

Utilisez le paramètre de format %02X:

printf("%02X",Word[i]);

Plus d'informations peuvent être trouvées ici: http://www.cplusplus.com/reference/cstdio/printf/

4
Bart Friederichs
void atoh(char *ascii_ptr, char *hex_ptr,int len)
{
    int i;

    for(i = 0; i < (len / 2); i++)
    {

        *(hex_ptr+i)   = (*(ascii_ptr+(2*i)) <= '9') ? ((*(ascii_ptr+(2*i)) - '0') * 16 ) :  (((*(ascii_ptr+(2*i)) - 'A') + 10) << 4);
        *(hex_ptr+i)  |= (*(ascii_ptr+(2*i)+1) <= '9') ? (*(ascii_ptr+(2*i)+1) - '0') :  (*(ascii_ptr+(2*i)+1) - 'A' + 10);

    }


}
0
Jeeno