Convertir une chaine de caratères to uint32_t

Résolu/Fermé
abyass Messages postés 18 Date d'inscription vendredi 30 juin 2017 Statut Membre Dernière intervention 21 août 2017 - 6 juil. 2017 à 11:48
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 12 juil. 2017 à 18:43
Bonjour,
J'ai besoin de vos aides SVP.

je veux convertir une chaine de caractères contenant 4 octets vers un uint32_t. J'ai utilisé 'strtoul' en choisissant la base 16 mais ça marche pas.


#include <stdio.h>
#include<stdlib.h>

#define BASE 16
int main(void)
{
char *str;
char *stopstr;
unsigned long ui;
size_t taille;
int i;

str="1A41BF02";
printf("str= %s\n", str);

ui=strtoul(str, &stopstr, BASE);
printf(" strtoul =%ld (base %d) \n", ui, BASE);

return 0;
}



Voilà ce que s'affiche:


Quelqu'un pourra m'aider SVP.
Merci :)


A voir également:

1 réponse

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
6 juil. 2017 à 13:17
Salut abyass,

Ton code fonctionne : 1A41BF02 en hexadécimal donne bien 440516354 en décimal.

Par contre, tu ne crées pas un uint32_t, mais un unsigned long.


Dal
0
abyass Messages postés 18 Date d'inscription vendredi 30 juin 2017 Statut Membre Dernière intervention 21 août 2017
6 juil. 2017 à 13:51
Merci pour votre réponse,

Oui je vois que la fonction retourne '1A41BF02' en décimal. Et je comprends pas car j'ai défini la BASE 16.

y a t-il une méthode pour convertir en uint32_t et non pas en unsigned long?

Merci :)
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié le 6 juil. 2017 à 15:37
Tu indiques à strtoul() que ce que contient la chaîne est une représentation sous forme de chaîne d'un entier en base 16. Cette information lui est nécessaire pour effectuer la conversion de chaîne en nombre.

Ensuite, le résultat de la conversion est stocké dans ta variable, et tu l'affiches avec printf. Comme tu n'indiques aucun spécificateur particulier pour afficher cet entier, printf l'affiche en base 10.

Si ce que tu veux c'est afficher l'entier en hexadécimal, utilise le spécificateur %x de printf

http://www.cplusplus.com/reference/cstdio/printf/

Ensuite, strtoul() va renvoyer un unsigned long. Si tu veux un uint32_t, tu dois faire un transtypage. Note que, dans l'un ou l'autre cas, le printf avec les spécificateurs de type affichera la valeur contenue dans la variable sous la forme d'un entier en base 10, sauf si tu utilises %x.

Donc, la conversion de chaîne en nombre est un problème différent de l'affichage du nombre.

Pouvoir faire tout cela suppose que tu ne dépasses pas les limites permises par les différents types en fonction de la chaîne entrée.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdint.h>
#include <errno.h>

#define BASE 16

int main(void) {
    char * str = "1A41BF02";
    unsigned long res;
    uint32_t ui;

    printf("str = %s\n", str);

    res = strtoul(str, NULL, BASE);
    if ((res == ULONG_MAX) && (errno == ERANGE)) {
        printf("Error: the number exceeds %lu\n", ULONG_MAX);
        printf("and cannot be converted to uint32_t (max %zu)\n", 
                UINT32_MAX);
        return EXIT_FAILURE;
    }

    if (res <= UINT32_MAX) {
        ui = (uint32_t)res;
        printf("= %08X (in base 16)\n", ui);
    } else {
        printf("%s is too big to fit in a uint32_t\n", str);
        return EXIT_FAILURE;
    }

    return 0;
}

Cet exemple tient compte des limites propres à l'architecture sur laquelle le code est compilé, gère les erreurs de dépassement, et affiche le nombre en hexadécimal en majuscules en le préfixant de 0 si nécessaire pour afficher 8 caractères composant les 4 octets.

Dal
0
abyass Messages postés 18 Date d'inscription vendredi 30 juin 2017 Statut Membre Dernière intervention 21 août 2017
12 juil. 2017 à 15:39
Merci pour votre réponse bien détaillée. :)
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
12 juil. 2017 à 18:43
De rien :-)
0