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 :

Char* et octets


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Nom
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Nom

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut Char* et octets
    Bonjour,

    j'aimerais définir une variable de type char*, mais qui contiendrait une séqeunce de valeurs hexadécimale. En l'occurence, une char* constitué des 3 octets suivant 0x13 0x14 0x15.

    Comment faire ?

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juin 2009
    Messages : 33
    Par défaut
    Bonjour,

    essaye ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tab[3] = { 0x13,0x14,0x15 };
    (si tu souhaites la traiter comme une chaine de caractères, rajoute le caractère '\0' à la fin du tableau (3 devient 4 donc)).


  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int main(void)
    {
        char tab[] = {0x13,0x14,0x15};
        char* ptr = tab;
        printf("%x\n", *ptr++);
        printf("%x\n", *ptr++);
        printf("%x\n", *ptr);
        return 0;
    }
    mais c'est terriblement crade. Dis-en plus.

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu peux aussi les stocker dans un int et ensuite y accéder avec un pointeur de type char* (attention à l'endianess par contre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void) {
    	int val_hex = 0x131415;
    	char * ptr = (char *) &val_hex;
    	printf("%#x\n", *ptr);
    	printf("%#x\n", *(ptr+1));
    	printf("%#x\n", *(ptr+2));
        return EXIT_SUCCESS;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Par défaut
    Bonjour,

    Désolé de m'inserer dans votre discussion, mais je suis assez intéresser du lien entre char* et octet pour mon projet.

    En fait j'ai un instruction en assembleur qui s'appelle
    Sa définition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rd<------contenu de l'adresse (Rn+S) sur 2 octets
    La fonction que je propose est celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* ldh (char* rn, char* s)
    Mais problème je ne sais pas
    1/ si ma signature est exacte
    2/ si oui comment faire pour obtenir ce que je veux, vu ke je n'ai pas tout à fait compris le lien entre char* et octet.

    Merci

  6. #6
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Salut

    Un char contient 1 octet.

    Un char* contient une adresse, sur 4 octets, qui va être celle d'un emplacement mémoire contenant un char, c'est a dire un octet.

    C'est donc en fait la notion de pointeur qui te chagrine.

    Le fait de rajouter le symbole * à la fin d'un type de variable signifie que tu ne va pas initialiser une valeur mais une adresse, ou bien une valeur a une adresse spécifiée.


    Soit l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char val;
    char* add_val;
     
    val=5; /*Initialise la valeur de la variable VAL*/
     
    add_val=&val; /* Initialise add_val pour qu'il contienne l'adresse de la variable VAL*/
     
    *add_val=10; /*Initialise le contenu présent a l'adresse pointée (d'ou le nom de pointeur :p) par add_val à 10, donc place 10 dans VAL*/
    Si on ajoute des printf entre, histoire de voir l'évolution :

    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
     
    char val;
    char* add_val=NULL;
    /*Pour illustrer les propos, on suppose val à l'adresse 0x50505050, mais c'est moi qui ai choisi cette valeur*/
     
    val=5;
     
    printf("VAL : %d, ADD_VAL : 0x%8X\n", val, add_val);
     
    add_val=&val;
     
    printf("ADD_VAL : 0x%8X, *ADD_VAL : %d\n", add_val, *add_val);
     
    *add_val=10;
     
    printf("VAL : %d, *ADD_VAL : %d", val,*add_val);
    Nous donnera comme execution (à prioris) :
    VAL : 5, ADD_VAL : 0x00000000
    ADD_VAL : 0x50505050, *ADD_VAL : 5
    VAL : 10, *ADD_VAL : 10

    L'adresse est contenu sur 4 octets alors qu'ici sont contenu est d'un octet (puisque c'est un char).

  7. #7
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Citation Envoyé par rilou Voir le message
    Un char* contient une adresse, sur 4 octets
    Un char* ne fait pas forcement 4 octets. Sur une machine 32 bits ton char* fera bien 4 octets, mais sur une machine 64 bits par exemple ton char* fera 8 octets

    Pour afficher des adresses je te conseille d'utiliser le formateur %p qui est fait pour ça.

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

Discussions similaires

  1. Octet, Char, Coding et I/O streams
    Par hassanJava dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 02/02/2009, 12h06
  2. Réponses: 2
    Dernier message: 15/02/2008, 12h19
  3. Réponses: 4
    Dernier message: 12/12/2007, 08h30
  4. Réponses: 4
    Dernier message: 10/04/2006, 22h34
  5. Existe-t'il un type tenant sur 2 octets ?
    Par benj63 dans le forum C++Builder
    Réponses: 13
    Dernier message: 20/06/2002, 17h03

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