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 :

Chaine => Décimal => Hexadécimal => Chaine : j'ai les neurones qui s'emmêlent


Sujet :

C

  1. #1
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut Chaine => Décimal => Hexadécimal => Chaine : j'ai les neurones qui s'emmêlent
    Contexte : Linux/Fedora

    J'ai un répertoire contenant des fichiers dont le nom est de forme numérique (c'est même des timestamp). Un script shell parcours ce dossier et lance un programme C pour chaque fichier en donnant son nom en paramètre au programme (for ... in ... etc.). Le programme en question récupère donc ce paramètre en format char, puis je le converti en hexa (mais toujours sous forme de char). Ensuite je découper cette chaine hexa par portion de 2 caractères pour convertir chaque couple en ASCII correspondant (pouah mais quel foutoir). La chaine ainsi obtenue est ensuite concaténée avec une entête particulière et transmise sur une socket.

    /* Fin du pavé descriptif */

    1. Auriez-vous un moyen plus rapide de passer du argv[x] => chaine ASCII ?
    2. Mon principal souci c'est que j'arrive pas trop à convertir un char *XXX = "FE" en 0xfe pour le coller dans une chaine via un sprintf(xxxx,"%c"...)

    Ça va faire un petit moment que je tourne en rond sans arriver à mes fins. J'ai utilisé du strtol, une fonction maison de decTohex, etc. mais rien à faire. Un petit coup de pouce serait le bienvenue. (j'avais perdu l'habitude de faire du C et le php m'a filé de salle manie avec sa facilité sur les types de données)
    Membre actif de la Pouy@geTe@m.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour,

    Il serait plus utile que tu nous dises directement ce que tu cherches à faire, car le « format char » est déjà de l'A.S.C.I.I. Plus précisément, « char » est un entier (signé par défaut), de taille suffisante pour contenir un caractère du « jeu d'exécution de base », pour citer la norme, en garantissant que le caractère issu de ce jeu et ainsi codé sera toujours positif. Cela fait que, concrètement, char est un entier signé 8 bits, qui contient directement le code ASCII en question, car le jeu ASCII officiel est sur 7 bits (0 à 127). Les seuls cas où tu pourrais avoir une différence sont les machines qui n'utilisent pas l'A.S.C.I.I. (ex: EBCDIC), ce qui commence à être très difficile à trouver.

    Par exemple :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main (void)
    {
        const char * chaine = "ABCDE";
     
        printf ("%c \n",'A');
        printf ("%c \n",65);
        printf ("%c \n",*chaine);
     
        return 0;
    }

    Ces trois lignes donnent le même résultat. « chaine » est un pointeur qui pointe le premier caractère de la chaîne "ABCDE". En le déférençant, on obtient ce premier caractère, et l'expression est alors du même type que les deux précédentes. Enfin, 'A' et 65 sont de type int mais sont automatiquement convertis.

    Après, une fois acquis le fait que ta variable du type char est un nombre entier censé contenir un code A.S.C.I.I. (car cet entier peut être utilisé à n'importe quoi), tu utilises « %c » printf() pour afficher le caractère correspondant, « %d » pour afficher sa valeur en décimal, ou « %x » pour l'afficher en hexadécimal. Tu peux même écrire directement « %02x » pour qu'il soit toujours formatté sur deux chiffres.

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    spin0us, pourrais-tu donner un exemple précis de ce que tu veux obtenir (chaîne en entrée, chaîne en sortie) ,

    Citation Envoyé par Obsidian Voir le message
    Plus précisément, « char » est un entier (signé par défaut), de taille suffisante pour contenir un caractère du « jeu d'exécution de base »
    Juste une petite précision, contrairement aux autres types entiers, char n'est pas forcément signé par défaut. Un char peut être signed ou unsigned au choix de l'implémentation.

  4. #4
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Alors voilà quelques précisions.

    La chaine en entrée : 1230237516
    Traduite en hexa ca donne : 4953EF4C
    A cela j'ajoute mon en-tête maison : FEF8
    Et encore deux couples pour compléter à la bonne taille.
    Ce qui donne : FEF8XXXX4953EF4C
    Et ce que je dois envoyer sur la socket c'est une chaine de ce type :
    sprintf(machaine,"%c%c%c%c%c...",0xfe,0xf8,.....);

    Vous voyez un peu le truc ou pas ?
    Membre actif de la Pouy@geTe@m.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Ok, tu n'as pas du tout besoin de passer par l'hexadécimal, en fait. Une fois acquise, la valeur représentée en décimal dans ta chaîne est stockée en binaire dans une variable, dont tu peux directement envoyer les octets, un à un.

    Donc, strtol() pour convertir une chaîne en entier binaire et htonl() pour être sûr qu'il soit stocké en big endian dans le tableau, si c'est de cette manière que tu comptes l'envoyer vers le réseau.

    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
    #include <stdlib.h>
    #include <stdint.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
     
    int main (void)
    {
        const char *    chaine = "1230237516";
        uint8_t         tableau [8] = { 0xFE,0xF8,0,0 };
     
        *(uint32_t *)(tableau+4) = htonl(strtol(chaine,NULL,0));
        send (socket,tableau,sizeof tableau,0);
     
        return 0;
    }

  6. #6
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    ...char est un entier signé 8 bits..
    J'ajouterais à ce qu'a dit gl, que la taille d'un char n'est pas forcément 8 bits.

    Citation Envoyé par Obsidian Voir le message
    ...Enfin, 'A' est de type char...
    'A' est un int et non un char.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    J'ajouterais à ce qu'a dit gl, que la taille d'un char n'est pas forcément 8 bits.
    C'est ce que j'explique plus haut, implicitement peut-être.

    'A' est un int et non un char.
    Corrigé, merci.

  8. #8
    Membre du Club Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Impeccable

    Je savais bien que je partais dans tous les sens pour un truc qui pouvait être fait beaucoup plus rapidement ...

    Merci.
    Membre actif de la Pouy@geTe@m.

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

Discussions similaires

  1. chaine de caractères avec hexadécimal
    Par roland34 dans le forum Général Python
    Réponses: 5
    Dernier message: 07/08/2013, 16h37
  2. Transformation chaine de caractère en hexadécimal
    Par cedrick21 dans le forum Langage
    Réponses: 10
    Dernier message: 16/07/2010, 14h24
  3. afficher tout les divs qui ont leurs id commence par la chaine "select"
    Par karimphp dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 04/01/2008, 15h27
  4. Réponses: 1
    Dernier message: 30/03/2007, 16h38
  5. Réponses: 6
    Dernier message: 14/06/2006, 15h27

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