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 :

Shift logique dans un tableau de char


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 100
    Points
    100
    Par défaut Shift logique dans un tableau de char
    Bonjour,

    J'ai un tableau de 4 unsigned chars représentant un mot de 32 bits.
    Je cherche à effectuer un shift logique de n bits, n étant une variable mais je ne vois pas trop comment procéder:
    autant je vois comment faire ça pour un int, autant pour un tableau de char ???

  2. #2
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    le plus simple serait de définir une union pour pouvoir manipuler à la fois tes données comme un tableau de 4 char, et comme un int, et la pu de problème.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 100
    Points
    100
    Par défaut
    Merci, je ne connaissais pas du tout les unions.
    Je découvre quelque chose de pratique !!

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Du point de vue de la portabilité du code,

    1- Utiliser un unsigned int plutôt qu'un int

    2- On ne devrait pas utiliser une union de cette façon : écriture dans l'union avec un membre et lecture avec un autre.

    3- Plus grave (parce que le problème sera plus fréquent), le résultat de cette méthode dépend du boutisme. Or il existe de nombreuses machines à boutisme Big Endian et de nombreuses autres à boutisme Little Endian.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 100
    Points
    100
    Par défaut
    Alors quelle serait la bonne solution ?
    Je recontre justement le problem d'endianess :
    si je shift le mot 46 0a 00 00 de 13 bits vers la droite (>>), j'obtiens le mot 00 00 00 00
    ce qui ne correspond pas à la représentation que je me fais: je m'attends plutôt à obtenir
    40 00 00 00 et cela plutôt comme résultat d'un shift à gauche.
    Comment faire ?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    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 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par oc_alex86 Voir le message
    Alors quelle serait la bonne solution ?
    Je recontre justement le problem d'endianess :
    si je shift le mot 46 0a 00 00 de 13 bits vers la droite (>>), j'obtiens le mot 00 00 00 00
    ce qui ne correspond pas à la représentation que je me fais: je m'attends plutôt à obtenir
    40 00 00 00 et cela plutôt comme résultat d'un shift à gauche.
    Le boutisme se fait au niveau de l'octet, pas du bit : l'ordre des octets est inversé en mémoire, mais le décalage des bits de chacun d'eux se fait quand même dans le bon sens. Vu du CPU, ton opération est en fait un « 00 00 0a 46 >> 13 ».

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Si on part du tableau {0x46, 0x0a, 0x00,0x00} assimilé dans une union à un unsigned int :
    - Si on est en little indian cet entier sera en hexadécimal 00000A46. Par un décalage à droite de 4 (par exemple) on obtient 000000A4 et dans le tableau {0xa4, 0x00, 0x00,0x00}. Par un décalage de 4 à gauche 0000A460, soit {0x60, 0xA4, 0x00,0x00}.

    - En big endian, on aura 460A0000 soit pour un décalage à droite de 4 {0x04, 0x60, 0xa0,0x00} et à gauche {0x60, 0xa0, 0x00,0x00}.

    Il est clair que si on veut passer par l'intermédiaire d'un unsigned int, il faut considérer que le tableau forme un nombre en big endian. Pour en être sûr, il suffit de calculer cet entier.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void shiftTab(unsigned char *tab, int shift)
    {
      int i;
      unsigned int res = 0;
      for(i=0; i<4;i++) res = (res << 8) | tab[i];
      if(shift<0)  res <<= -shift;
      else res >>= shift;
      for(i=0; i<4;i++, res >>= 8)tab[3-i] = res ;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 100
    Points
    100
    Par défaut
    Cool, merci beaucoup.
    C'est beaucoup plus clair maintenant

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

Discussions similaires

  1. Entrer une grille dans un tableau de char
    Par killersky4 dans le forum Débuter
    Réponses: 3
    Dernier message: 05/01/2009, 16h41
  2. Intégrer une vaiable float dans un tableau de char
    Par NoritakaRomain dans le forum C
    Réponses: 2
    Dernier message: 14/05/2007, 15h19
  3. Copier un long dans un tableau de char?
    Par the_ionic dans le forum C
    Réponses: 15
    Dernier message: 29/06/2006, 09h31
  4. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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