Signaler

Convertir une chaine de caratères to uint32_t [Résolu]

Posez votre question abyass 18Messages postés vendredi 30 juin 2017Date d'inscription 21 août 2017 Dernière intervention - Dernière réponse le 12 juil. 2017 à 18:43 par [Dal]
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 :)


Utile
+0
plus moins
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
abyass 18Messages postés vendredi 30 juin 2017Date d'inscription 21 août 2017 Dernière intervention - 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 :)
Répondre
[Dal] 4382Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 20 septembre 2017 Dernière intervention - 6 juil. 2017 à 15:23
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
Répondre
abyass 18Messages postés vendredi 30 juin 2017Date d'inscription 21 août 2017 Dernière intervention - 12 juil. 2017 à 15:39
Merci pour votre réponse bien détaillée. :)
Répondre
[Dal] 4382Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 20 septembre 2017 Dernière intervention - 12 juil. 2017 à 18:43
De rien :-)
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !