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

  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.

  8. #8
    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
    Ok: je comprends un peu mieux le rapport entre char* et octet.

    Cependant, quand j'ai une telle instruction comme celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rd<------contenu de l'adresse (Rn+S) sur 2 octets
    je ne vois pas comment on peut regrouper deux octet puisque vous dites qu'une adresse c'est 4 octet.

  9. #9
    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
    En C un pointeur fera toujours la même taille.
    Cependant en assembleur tu peux gérer des adresses de plus petite taille
    Par exemple une adresse sur 64 bits tu auras le registre rax (parmis d'autres).
    Mais tu pourras toujours accéder aux registres plus petits (eax, ax, ah, al) qui eux ont des adresses plus petites (rax = 64bits, eax = 32bits, ax = 16bits, ah = al = 8bits).

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    contenu de l'adresse (Rn+S) sur 2 octets
    est ambigu : est-ce l'adresse qui est sur 2 bytes (et la donnée est alors sur combien de bytes ?) ou est-ce le contenu de l'adresse qui est sur 2 bytes ?

    Dans le second cas, tu as l'adresse (Rn+S), sur n bytes, d'un objet qui lui fait 2 bytes. Donc tu dois lire et mettre ensemble le byte à l'adresse (Rn+S) et celui à l'adresse (Rn+S+1) pour former une seule valeur (quel byte est celui de poids fort et lequel est celui de poids faible, ça dépend de ton système)

  11. #11
    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
    J'avoue que c'est ambigüe et c'est peut être pour cela que je ne suis pas vraiment inspiré, car je ne sais pas ce l'on me demande de faire.
    Je verrais ça avec mon professeur et jy réfléchirais...
    Merci quand même.

  12. #12
    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
    Citation Envoyé par Pouet_forever Voir le message
    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.
    Oui, bien sur :s Désolé, j'était parti sur un machine 32 bit.

    Mais effectivement, si la personne travaille sur une machine 64 bit ou même un pic 8 ou 16 bit la taille du bus d'adresse est en conséquence et donc la taille de l'adresse elle même....

    Encore désolé :s

+ 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, 13h06
  2. Réponses: 2
    Dernier message: 15/02/2008, 13h19
  3. Réponses: 4
    Dernier message: 12/12/2007, 09h30
  4. Réponses: 4
    Dernier message: 10/04/2006, 23h34
  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, 18h03

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