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 :

Tableau de unsigned char vers DWORD


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut Tableau de unsigned char vers DWORD
    Bonjour mon problème de conversion de la journée est le suivant !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unsigned char aby_user_id[4];
    aby_user_id[0] = 0;
    aby_user_id[1] = 0;
    aby_user_id[2] = 9;
    aby_user_id[3] = 9;
     
    // pour le convertir en DWORD comme cela 
    DWORD dw_test = 99;
    Je vous remercie pour votre aide !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    c'est ultra trivial

    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
        unsigned int value;
        unsigned char array_len, digit, ten;
     
    // ... array_len = 4
     
        value = 0;
        ten   = 1;
     
        for(digit = array_len; digit > 0; --digit, ten*=10) {
            value += (array[array_len - digit] * ten);
        }
     
        DWORD dvalue;
     
        dvalue = (DWORD) value ; // perte de données
        dvalue = (value & 0x00FFFF); // ou bien

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Salut foetus,

    j'ai un peu de mal à comprendre ton code à vrai dire :s !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Déroule ma boucle
    Tu pars de la dernière case (la 4ième), value vaut 0 et ten vaut 1

    1ière itération: value = value + 9 * 1 = 0 + 9 * 1 = 9
    On multiplie par 10 ten -> ten = 10

    2ième itération: 3ième case

    value = value + 9 * 10 = 9 + 9 * 10 = 99
    On multiplie par 10 ten -> ten = 100

    3ième itération: 2ième case

    value = value + 0 * 100 = 99 + 0 * 100 = 99
    On multiplie par 10 ten -> ten = 1000

    3ième itération: 1ière case

    value = value + 0 * 1000 = 99 + 0 * 1000 = 99
    On multiplie par 10 ten -> ten = 10000

    fin de l'itération -> value 99

  5. #5
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    D'accord c'est plus clair en effet ^^ je remplace "array" par mon tableau de byte si j'ai bien pigé donc ?

  6. #6
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(digit = array_len; digit > 0; --digit, ten*=10) {
    			value += (m_aby_user_id[array_len - digit] * ten);
    		}
    value = 2988 // oups
    à partir de la troisième itération mon "ten" = 232, alors qu'on doit attendre 1000.

  7. #7
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    c'est bon, en fait tu partais du principe que le tableau de byte était rempli comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    m_aby_user_id[0] = 9;
    m_aby_user_id[1] = 9;
    m_aby_user_id[2] = 0;
    m_aby_user_id[3] = 0;
    alors que je le rempli comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    m_aby_user_id[0] = 0;
    m_aby_user_id[1] = 0;
    m_aby_user_id[2] = 9;
    m_aby_user_id[3] = 9;
    et en effet je trouve bien value = 99, un grand merci foetus !

  8. #8
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour
    Quelque précision: Un DWORD est un entier non signé de 32 bits dont la plage de valeur décimale va de 0 à 4294967295. Et vu que DWORD est t’un type non signé, son premier bit (le bit le plus significatif appelé MSB) n'est pas réservé pour la signature en clair pour les nombres négatifs.

    Citation Envoyé par foetus Voir le message
    c'est ultra trivial

    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
        unsigned int value;
        unsigned char array_len, digit, ten;
     
    // ... array_len = 4
     
        value = 0;
        ten   = 1;
     
        for(digit = array_len; digit > 0; --digit, ten*=10) {
            value += (array[array_len - digit] * ten);
        }
     
        DWORD dvalue;
     
        dvalue = (DWORD) value ; // perte de données
        dvalue = (value & 0x00FFFF); // ou bien
    Personnellement, le code que vous avez proposé n’est pas vraiment trivial il est beaucoup trop lourd je propose les instructions ci-dessous qui me semblent beaucoup plus simples à mon sens suivant le résultat souhaité.
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    /*
     ============================================================================
     Name        : Untitled.c
     Author      : SAMBIA39
     Version     : 0.1
     Copyright   : Copyright (c) 27/11/2016 SAMBIA39
     Description : Ansi-style
     ============================================================================
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    typedef unsigned char BYTE;  // BYTE  = unsigned char 
    typedef unsigned long DWORD; // DWORD = unsigned long
     
    int main( void ){
     
    	int ret_value = 0;
    	DWORD convert = 0;
     
    	BYTE t_byte[5] = { '0', '0', '9', '9','\0' };   // Tableau unsigned char = BYTE
    	sscanf((char*)t_byte, "%ld", &convert );	// Conversion Cas 1 en DWORD
    	sscanf((char*)t_byte, "%d", &ret_value);	// Conversion Cas 2 en INT 
    	fprintf( stdout, "(Cas 1) -> %ld\n(Cas 2) -> %d\n", 
    		convert, ret_value );
     
    	return EXIT_SUCCESS;
    }
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  9. #9
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Merci pour cette précision sambia39, ton code pourra me servir !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Attention, ce code est faux car il utilise sscanf() sur des chaînes non-terminées.
    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.

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Et personne a vu que le bug du code de foetus était que ten était un charactére et non un entier?


  12. #12
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour;
    Effectivement il y a un oubli de terminaison de chaînes de caractères ‘\0’ ce qui peut causer un débordement. Hormis cet oubli on quoi l’ensemble des instructions sont elle fausse . Pourriez-vous m’éclairer ?
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Et personne a vu que le bug du code de foetus était que ten était un charactére et non un entier?
    Effectivement , mais ce n'est pas un bug parce qu'un char est aussi un entier (j'ai déclaré là où il y avait déjà une variable sans vérifier le type)

    Mais il est limité entre 0 et 255 (non signé) ou -127 +128 (signé) (à 1 près, je ne sais jamais).
    Donc seulement 10 ou 100 sont valides. Après on a des débordements/ troncatures.


    Édit: On peut garder le char , mais comme multiplicateur de 10.

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    C'est quand même un bug ;-) Ou alors une sacrée feature

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Unsigned char vers char*
    Par phoenixgreg dans le forum C
    Réponses: 11
    Dernier message: 06/12/2016, 19h19
  2. [JNI] : Type unsigned char* vers jbyteArray
    Par lautac dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 27/08/2013, 10h41
  3. tableau de char vers string hexa
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 23/07/2007, 00h10
  4. pb conversion unsigned char vers char *
    Par FamiDoo dans le forum C
    Réponses: 11
    Dernier message: 24/08/2006, 19h11
  5. [Clé de registre] Conversion char* vers unsigned char*
    Par The Lord of Nesquik dans le forum C
    Réponses: 7
    Dernier message: 04/07/2006, 00h30

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