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 :

convertir "uint32_t uuid128[4]" en "uint8_t uuid[16]"


Sujet :

C

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut convertir "uint32_t uuid128[4]" en "uint8_t uuid[16]"
    Bonjour,

    je voudrais convertir un "uint32_t uuid128[4]" en "uint8_t uuid[16]", comment m'y prendre ?

    Merci.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par pol2095 Voir le message
    je voudrais convertir un "uint32_t uuid128[4]" en "uint8_t uuid[16]", comment m'y prendre ?
    Exactement de la même façon que de convertir un "uint32_t x" en "uint8_t y[4]". Tu réfléchis à ce que ça représente pour toi, puis tu codes l'opération, et enfin tu l'appliques sur les 4 valeurs de ton tableau d'origine.
    Si c'est juste une bête copie des 32 bits de la variable d'origine dans chacun des 8 bits de la variable de destination, alors une simple "union" fera le job
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef union {
    	uint_32t x;
    	uint_8_t y[4];
    } t_convert;
     
    t_convert c;
    // Copier la valeur dans c.x et la récupérer depuis c.y
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    Merci pout ton aide, mais peux-tu détailler la suite du code ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Non. Ici ce n'est pas "allo pizzacode, je voudrais un code gratos". Tu veux de l'aide parce que tu as écris un code qui pose souci on t'aidera en te disant ce qui ne va pas et/ou éventuellement comment l'optimiser. Mais "aider" ce n'est pas faire les choses à ta place.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    quelque chose comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef union {
    	uint_32t x;
    	uint_8_t y[4];
    } t_convert;
     
    t_convert c;
     
    c.x = uuid128;
    uint8_t uuid[16] = c.y;

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pol2095 Voir le message
    c.x = uuid128;
    C'est quoi "uuid128" ? C'est une valeur ? Parce que quand on écrit "var=x" ça sous-entend que "x" est soit une valeur, soit une variable contenant une valeur !!!

    Citation Envoyé par pol2095 Voir le message
    uint8_t uuid[16] = c.y;
    Euh non. c.y correspond à c.x mais codé différemment. C'est donc "un" uuid128.
    Quel mot tu n'as pas compris dans "puis tu codes l'opération, et enfin tu l'appliques sur les 4 valeurs de ton tableau d'origine." ??? Parce que copier un xxx[4] dans un yyy[16] c'est faire 4 fois "copier un n dans un yyy[4]" quoi...

    Si tu débutes en C fallait déjà le dire et surtout aller dans la section "débutants" !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    laisse tomber je chercherai de l'aide ailleurs, je ne suis pas un spécialiste en C.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    ce code peut-il fonctionner ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    uint32_t uuid128[4] = <some 32 bit signed or unsigned int>;
    int8_t uuid[16] = { 0 };
    for( int i = 0; i < 4; i++ )
    {
    	uuid[i*4] = (int8_t)(uuid128[i]>>24);
    	uuid[i*4+1] = (int8_t)(uuid128[i]>>16);
    	uuid[i*4+2] = (int8_t)(uuid128[i]>>8);
    	uuid[i*4+3] = (int8_t)(uuid128[i]);
    }

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    Est-ce qu'union fonctionne comme cela ?

    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
    typedef union {
    	uint32_t x;
    	uint8_t y[4];
    } t_convert;
     
    t_convert c1;
    t_convert c2;
    t_convert c3;
    t_convert c4;
     
    uint32_t uuid128[4] = <some 32 bit signed or unsigned int>;
    c1.x = uuid128[0];
    c2.x = uuid128[1];
    c3.x = uuid128[2];
    c4.x = uuid128[3];
    uint8_t uuid[16] = { c1.y[0], c1.y[1], c1.y[2], c1.y[3], c2.y[0], c2.y[1], c2.y[2], c2.y[3], c3.y[0], c3.y[1], c3.y[2], c3.y[3], c4.y[0], c4.y[1], c4.y[2], c4.y[3] };

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pol2095 Voir le message
    Est-ce qu'union fonctionne comme cela ?

    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
    typedef union {
    	uint_32t x;
    	uint_8_t y[4];
    } t_convert;
     
    t_convert c1;
    t_convert c2;
    t_convert c3;
    t_convert c4;
     
    uint32_t uuid128[4] = <some 32 bit signed or unsigned int>;
    c1.x = uuid128[0];
    c2.x = uuid128[1];
    c3.x = uuid128[2];
    c4.x = uuid128[3];
    int8_t uuid[16] = { c1.y[0], c1.y[1], c1.y[2], c1.y[3], c2.y[0], c2.y[1], c2.y[2], c2.y[3], c3.y[0], c3.y[1], c3.y[2], c3.y[3], , c4.y[0], c4.y[1], c4.y[2], c4.y[3] };
    Oui c'est ça.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    ce qui est bizarre, c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cout<<uuid128;
    cout<<uuid;
    n'affiche pas la même valeur, est-ce normal ?

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pol2095 Voir le message
    est-ce normal ?
    Tes transferts se font bit par bit et tes affichages (C++ alors qu'ici on est en C) prennent en compte l'endianess...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    Penses-tu que ce code ne risque pas de poser de problème d'endianess ?

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    En C il y a deux types de problèmes
    • les problèmes de UB (un code correct mais incorrectement utilisé comme par exemple remplir une zone pointée sans maîtriser le pointeur).
    • les problèmes de logique (mettre un carré dans un rond et espérer que ça reste un carré)

    Les soucis UB c'est gérable. Avec un peu d'acharnement on trouve l'erreur et on corrige. Les soucis de logique eux ne le sont pas. Si je copie 500 dans un char, j'obtiens 244. Ce n'est pas une erreur du C, c'est une erreur de ma propre conception (oublier qu'un char ce n'est que 8 bits et que le nombre 500 ça en prend 9).

    Toi tu veux copier des bits dans des zones. La copie en elle-même ne posera aucun souci. Mais est-ce que cette copie a un sens... seul toi a la réponse.

    Exemple plus parlant
    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
    #include <stdio.h>
     
    typedef union {
    	long i;
    	float f;
    } t_xxx;
     
    int main() {
    	t_xxx xxx;
    	xxx.i=847512;
    	printf("i=%ld, f=%f, hex=%08lx\n", xxx.i, xxx.f, xxx.i);
     
    	xxx.f=847512;
    	printf("i=%ld, f=%f, hex=%08lx\n", xxx.i, xxx.f, xxx.i);
    }

    Compile et exécute et tu comprendras l'idée. Même si un long et un float font tous deux 32 bits, le codage interne de ces bits n'est pas le même dans l'un que dans l'autre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    J'ai testé sur Ubuntu pour un client Bluetooth RFCOMM, j'ai besoin de l'UUID pour me connecter à un serveur RFCOMM sous Windows, ça fonctionne nickel, ça n'a pas l'air de poser de problème.

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pol2095 Voir le message
    ça n'a pas l'air de poser de problème.
    Je n'ai jamais dit que ça en poserait (surtout que c'est la première fois que tu expliques le but de l'opération). J'ai juste dit que c'était à toi de savoir ce que tu fais.
    Ceci dit, le uuid c'est peut-être du nombre mais c'est avant tout une chaine (chaine de chiffres certes mais chaine). Tu n'aurais donc pas eu avantage à passer par du char[]? Je veux transférer 123456 en environnements hétérogènes ben j'écris la chaine "123456" (sprintf) et c'est la chaine que je transfère. Et de l'autre côté je reconvertis "123456" en nombre 123456 (sscanf).
    Au moins tu n'as plus à t'inquiéter de l'endianness de tes chiffres...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/07/2012, 01h17
  2. [java 1.4] convertir une simple quote
    Par longbeach dans le forum Langage
    Réponses: 5
    Dernier message: 11/09/2008, 15h28
  3. Quote dans une requete...
    Par Isildur dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/06/2006, 10h57
  4. Quotes dans TFilenameEdit (RXLib)
    Par AnnSo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/01/2003, 20h26

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