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 :

Python equivalent en C


Sujet :

C

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Donc on doit bien faire appel à pack_B pour le len et pack_pct_ds pour le char*, non ?

  2. #22
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Vous vous rendez compte du problème XY ?

    On a au départ un truc certainement écrit en qui utilise des structures. Ensuite on passe en pyhton qui ne propose pas le même type natif mais passe par un module externe pour créer ces structures C. On revient en C ensuite et on essaye d'initer le comportement du module python … et du coup on fait un truc tout compliqué !
    C'est pas un peu le serpent qui se tire une balle dans le pied ça ?

  3. #23
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Bon, j'ai essayé de faire comme tu as dit piceodev.
    Est-ce qu'on obtient ça du coup ?
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
        typedef struct
        {
            unsigned char lensourceid1;
            unsigned char lendestinationid1;
            unsigned char lennamespace1;
            unsigned char lenlndata;
            unsigned char lendata;
            unsigned char gettypeenum1;
            unsigned char protocolVersion;
            unsigned char gettypestring1;
            unsigned char len_sourceid2;
            char *sourceid;
            unsigned char gettypestring2;
            unsigned char lendestinationid2;
            char *destination;
            unsigned char gettypestring3;
            unsigned char lennamespace2;
            char *namespace;
            unsigned char gettypeenum2;
            unsigned char payloadtype;
            unsigned char gettypebytes;
            unsigned char lndata;
            char *data;
        } Request;
     
        Request req1;
        req1.lensourceid1 = strlen(source_id);
        req1.lendestinationid1 = strlen(destination_id);
        req1.lennamespace1 = strlen(namespace);
        req1.lenlndata = 1;
        req1.lendata = strlen(data);
        req1.gettypeenum1 = getType(1, TYPE_ENUM);
        req1.protocolVersion = protocolVersion;
        req1.gettypestring1 = getType(2, TYPE_STRING);
        req1.len_sourceid2 = strlen(source_id);
        req1.sourceid = malloc(req1.len_sourceid2);
        strcpy(req1.sourceid, source_id);
        req1.gettypestring2 = getType(3, TYPE_STRING);
        req1.lendestinationid2 = strlen(destination_id);
        req1.destination = malloc(req1.lendestinationid2);
        strcpy(req1.destination, destination_id);
        req1.gettypestring3 = getType(4, TYPE_STRING);
        req1.lennamespace2 = strlen(namespace);
        req1.namespace = malloc(req1.lennamespace2);
        strcpy(req1.namespace, namespace);
        req1.gettypeenum2 = getType(5, TYPE_ENUM);
        req1.payloadtype = payloadtype;
        req1.gettypebytes = getType(6, TYPE_BYTES);
        req1.lndata = strlen(data);
        req1.data = malloc(req1.lndata);
        strcpy(req1.data, data);
    Puis l'envoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(sock, &req1, sizeof req1);

  4. #24
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    @AchilleFraise, On te donne deux moyens différents pour atteindre ton objectif. Tu sembles un peu perdu entre les possibilités. Il faut à la fois bien suivre la partie Python et bien comprendre le code C que tu génères.
    Pour la méthode par structure, selon moi elle a des pièges (ainsi tu y a mis des pointeurs et en aucun cas ça n'a de sens de transmettre un pointeur à une entité externe), il y des données à longueurs variables dans la trame et cela n'est pas simple à coder en C.
    Je t'ai proposé de procéder par écriture dans un buffer (méthode plus génèrale).
    Au final le but des deux méthodes est identique, arriver à une zone de mémoire remplie avec les bonnes données au bon format pour la transmettre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        // Le format ">" indique bigEndian, "B" sont des octets, "%d" spécifie la longueur du "s"
    msg = pack(">BBBB%dsBB%dsBB%dsBBB%ds%ds"
        // pour chaque %d du format indique sa longueur (ne correspond à aucune donnée à mettre dans msg!)
    %(len(source_id),len(destination_id),len(namespace),len(lnData),len(data)),
        // les données à placer dans la trame(ou la structure) sont indiquées à partir d'ici
    getType(1,TYPE_ENUM),protocolVersion,getType(2,TYPE_STRING),  // correspond à BBB
    len(source_id),source_id,                        // correspond à B%ds donc lg sur 1oct et chaîne sur sa lngueur 
    getType(3,TYPE_STRING),len(destination_id),destination_id, // correspond à BB%ds
    getType(4,TYPE_STRING),len(namespace),namespace, // correspond à BB%ds
    getType(5,TYPE_ENUM),0,getType(6,TYPE_BYTES),    // correspond à BBB
    lnData,                                          // correspond à %ds, lnData est une chaîne calculée avant
    data)                                            // correspond à %ds

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Donc ca donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned offset = 4; // reserver 4 octets pour le pack("I") fait en dernier
       offset = pack_B( buffer , offset , getType(1, TYPE_ENUM) );
       offset = pack_B( buffer , offset , protocolVersion );
       offset = pack_B( buffer , offset , getType(2, TYPE_STRING) );
       offset = pack_B( buffer , offset , strlen(source_id) );
       ...
       send(sock, buffer , offset, 0);
    }
    ?

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Personne ?
    J'ai 4 octets de trop et le 4 octets n'est pas le bon. Sinon le reste du message va bien

    Edit : Pour les 4 octets de trop je pense que c'est à cause du
    dans pack_I, car on a déjà compté les 4 dans l'offset de départ. Mais pour le 4e octet du message qui n'est pas le bon ?

  7. #27
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Désolé, c'est plutôt le += de la fin que je t'ai indiqué qui doit être enlevé (sinon compte 2 fois ces 4 octets.)

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Dac, merci

  9. #29
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juin 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Et pour cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def getLenOf(s):
    	x = ""
    	l = len(s)
    	while(l > 0x7F):
    		x += pack("B",l & 0x7F | 0x80)
    		l >>= 7
    	x += pack("B",l & 0x7F)
    	return x
    J'ai fais ça :
    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
    17
    18
    19
    20
    uint8_t *getLenOfBis(const char *s)
    {
        uint8_t *x;
        int len = strlen(s);
        int offset = 0;
     
        x = malloc(3);
        x[0] = 0;
        x[1] = 0;
        x[2] = 0;
     
        while(len > 0x7F)
        {
            offset=pack_B(x, offset, len&0x7F|0x80);
            len >>=7;
        }
        offset = pack_B(x, offset, len&0x7F);
        printf("%s\t%d\n", x, offset);
        return x;
    }
    , mais ce ne marche pas

  10. #30
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AchilleFraisse Voir le message
    mais ce ne marche pas
    Bonjour

    Déjà moi le malloc je lui demanderais d'allouer 3 * sizeof uint8_t octets au lieu de seulement 3 octets. Et s'il faut tout remplir ensuite de 0 ben on peut aussi alors se tourner alors vers memset ou faire un pack complet via calloc mais bon, le faire à la main ça marche aussi surtout que j'ai lu une fois dans ce forum une intéressante discussion où l'auteur disait que tout remplir une variable de 0 binaire ne garantit pas la valeur "0" à l'arrivée parce que rien n'oblige "0" à être codé "0x0000").

    Mais surtout dans le code Python il y a un x qui est initialisé puis qui est ensuite modifié via le x += .... Or dans le code C, je ne vois rien d'analogue. Ce que renvoie la fonction pack va remplir un "offset" (offset qui est réutilisé à l'itération suivante) mais ne semble pas toucher à "x" (sauf que comme c'est un pointeur il est peut-être directement modifié par la fonction comme le montre l'exemple de dalfab). Mais si c'est cela, alors un autre souci c'est que cette boucle pourrait faire bien plus que 3 itérations tandis que "x" n'est prévu que pour 3 items.

    Sinon quand tu dis "ce ne marche pas", tu ne pourrais pas être plus clair ? Par exemple tu affiches "x" et "offset" avant de le retourner. Tu n'aurais pas eu en plus l'idée d'afficher x[0], x[1] et x[2] et nous dire "en plus" si le contenu de tout cet affichage était cohérent avec ce que tu attends ??
    Et sinon t'as testé de façon individuelle ta fonction pack ??? (remarque ça rejoint ma demande précédente)...
    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]

Discussions similaires

  1. Equivalent de "PAUSE" en Python ?
    Par Lenezir dans le forum Général Python
    Réponses: 12
    Dernier message: 16/08/2011, 12h05
  2. Equivalent sort -u unix en python
    Par AnsuzPeorth dans le forum Général Python
    Réponses: 7
    Dernier message: 13/03/2010, 19h37
  3. Réponses: 3
    Dernier message: 03/07/2009, 10h58
  4. [WxRuby] Equivalent python de CheckListCTRL
    Par Jeremy0201 dans le forum Ruby
    Réponses: 0
    Dernier message: 09/01/2009, 13h05
  5. Equivalent à sleep en python
    Par breakwall dans le forum Général Python
    Réponses: 3
    Dernier message: 09/10/2008, 16h28

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