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 :

Comment récupérer les octets contenus dans un entier ?


Sujet :

C

  1. #1
    raphdatcom
    Invité(e)
    Par défaut Comment récupérer les octets contenus dans un entier ?
    Bonjour,

    Je cherche à récupérer les octets contenus dans un entier ???

    int nombre = 11804;
    unsigned char tableauOctets[4];

    en sachant que 11804 vaut 0x2b4c en hexa

    je voudrais obtenir:

    tableauOctets[0] = 0x00
    tableauOctets[0] = 0x00
    tableauOctets[0] = 0x2b
    tableauOctets[0] = 0x4c

    Ca parait basique ...

    Merci de me donner un petit coup de main si vous savaez faire ça

  2. #2
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int nombre = 11804;
    unsigned char tableauOctets[4];
     
    tableauOctets[0] = (unsigned char) nombre;
    tableauOctet[1] = (unsigned char) (nombre << 8);
    tableauOctet[2] = (unsigned char) (nombre << 16);
    tableauOctet[3] = (unsigned char) (nombre << 24);
     
    printf("%x %x %x %x", tableauOctet[0], tableauOctet[1], tableauOctet[2], tableauOctet[3]);

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int nombre = 11804;
    unsigned char * tableauOctets = (unsigned char *)(&nombre);
     
    printf( "%02X %02X %02X %02X", tableauOctets[0], tableauOctets[1], tableauOctets[2], tableauOctets[3]);

  4. #4
    raphdatcom
    Invité(e)
    Par défaut
    cmoibal,

    ...ça ne marche pas !!! mais merci quand même


    quentind,

    ... ça marche !!! Merci bien

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Attention:
    1. Le code de cmoibal comporte une légère erreur (il faut utiliser l'opérateur >> au lieu de l'opérateur <<), mais est indépendant l'endianness de l'architecture: Son code affichera toujours l'octet de poids le plus faible en premier (little-endian).
    2. Le code de quentind, lui, est à déconseiller pour la raison opposée: Selon l'endianess de la machine, il affichera l'octet de poids le plus fort en premier (big-endian), ou le plus faible (little-endian).

    Et bien sûr, ces deux codes dépendent du fait qu'un int fasse quatre char et qu'un char fasse 8 bits.

  6. #6
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    MERCI Médinoc pour la correction

    Et trés bonne explication ....

  7. #7
    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
    Salut,

    Citation Envoyé par raphdatcom
    <...>
    en sachant que 11804 vaut 0x2b4c en hexa
    <...>
    euhh NON en hexa 11804 c'est 0x2E1C

    Code Ma modeste version : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        #define MAXSIZE 4
        #define CHARSIZE 8
        <...>    
        unsigned int nombre = 11804;
        unsigned char tableauOctet[MAXSIZE];
        size_t i=0;
        size_t shift=0;
        while( nombre && i<MAXSIZE )
        {
            nombre>>=shift;
            tableauOctet[i]=(unsigned char) nombre;
            shift+=CHARSIZE;
            i++;
        }
    @++

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Attention:
    [LIST=1][*]Le code de cmoibal comporte une légère erreur (il faut utiliser l'opérateur >> au lieu de l'opérateur <<), mais est indépendant l'endianness de l'architecture: Son code affichera toujours l'octet de poids le plus faible en premier (little-endian).
    Ajouter à cela qu'il utilise un int au lieu d'un unsigned, pour peu que le nombre soit négatif, le résultat du décalage à droite est implementation defined.
    De plus, indépendant de l'endianess? quid de l'endianess d'un PDP ? j'ai un doute!

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 295
    Points : 36 792
    Points
    36 792
    Par défaut l'endianess d'un PDP
    Citation Envoyé par nicolas.sitbon Voir le message
    De plus, indépendant de l'endianess? quid de l'endianess d'un PDP ? j'ai un doute!
    A priori PDP-11 = 'little-endian'
    - W

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    A priori PDP-11 = 'little-endian'
    - W
    endian.h from glibc
    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
    53
    54
    55
    56
    57
    58
    /* Copyright (C) 1992, 1996, 1997, 2000 Free Software Foundation, Inc.
       This file is part of the GNU C Library.
     
       The GNU C Library is free software; you can redistribute it and/or
       modify it under the terms of the GNU Lesser General Public
       License as published by the Free Software Foundation; either
       version 2.1 of the License, or (at your option) any later version.
     
       The GNU C Library is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       Lesser General Public License for more details.
     
       You should have received a copy of the GNU Lesser General Public
       License along with the GNU C Library; if not, write to the Free
       Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
       02111-1307 USA.  */
     
    #ifndef	_ENDIAN_H
    #define	_ENDIAN_H	1
     
    #include <features.h>
     
    /* Definitions for byte order, according to significance of bytes,
       from low addresses to high addresses.  The value is what you get by
       putting '4' in the most significant byte, '3' in the second most
       significant byte, '2' in the second least significant byte, and '1'
       in the least significant byte, and then writing down one digit for
       each byte, starting with the byte at the lowest address at the left,
       and proceeding to the byte with the highest address at the right.  */
     
    #define	__LITTLE_ENDIAN	1234
    #define	__BIG_ENDIAN	4321
    #define	__PDP_ENDIAN	3412
     
    /* This file defines `__BYTE_ORDER' for the particular machine.  */
    #include <bits/endian.h>
     
    /* Some machines may need to use a different endianness for floating point
       values.  */
    #ifndef __FLOAT_WORD_ORDER
    # define __FLOAT_WORD_ORDER __BYTE_ORDER
    #endif
     
    #ifdef	__USE_BSD
    # define LITTLE_ENDIAN	__LITTLE_ENDIAN
    # define BIG_ENDIAN	__BIG_ENDIAN
    # define PDP_ENDIAN	__PDP_ENDIAN
    # define BYTE_ORDER	__BYTE_ORDER
    #endif
     
    #if __BYTE_ORDER == __LITTLE_ENDIAN
    # define __LONG_LONG_PAIR(HI, LO) LO, HI
    #elif __BYTE_ORDER == __BIG_ENDIAN
    # define __LONG_LONG_PAIR(HI, LO) HI, LO
    #endif
     
    #endif	/* endian.h */

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Le code basé sur un décalage à droite reste indépendant de l'endianness même sur PDP, car il ne lit pas octet par octet en mémoire.

    @ssmario2 : Pourquoi ne pas définir MAXSIZE en tant que sizeof(int) au lieu de 4 hard-codé ?
    Et pour CHARSIZE, tu peux utiliser la macro CHAR_BIT (ou CHAR_BITS, je ne sais plus), définie dans <limits.h>

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le code basé sur un décalage à droite reste indépendant de l'endianness même sur PDP, car il ne lit pas octet par octet en mémoire.
    effectivement mais l'autre remarque reste valable.

  13. #13
    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
    @Médinoc : je n'y avais pas pensé , en effet c'est plus correcte MERCI

    P.S : Oui c'est bel et bien CHAR_BIT

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 295
    Points : 36 792
    Points
    36 792
    Par défaut warf
    Citation Envoyé par nicolas.sitbon Voir le message
    endian.h from glibc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    #define	__LITTLE_ENDIAN	1234
    #define	__BIG_ENDIAN	4321
    #define	__PDP_ENDIAN	3412
    ...
    C'est ce que les fous du 32 bits appellent 'middle endian'. But d'un point de vue pratique tu as une relation entre l'endianness et la longueur des mots qui designent une adresse. Sur le PDP, ces mots sont 16 bits et 'si on travaille avec cà' middle endian = little endian.

    Par contre, si on sort de la boite... ie on mappe ces représentations dans un espace d'adressage 32 bits.... on se retrouve a dire 'middle endian'.

    Rigolo n'est ce pas?
    Mais cela est un mal de tête que nous avions dans les années 80s... Aujourd'hui tout cela est de l'histoire... Alors 'little-endian' modulo le trick sur l'espace d'adressage va très bien...
    - W

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Sauf que les mac non-intel, et certains gros serveurs sous certains systèmes POSIX, sont toujours en big-endian...

  16. #16
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 121
    Points
    28 121
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Mais cela est un mal de tête que nous avions dans les années 80s... Aujourd'hui tout cela est de l'histoire... Alors 'little-endian' modulo le trick sur l'espace d'adressage va très bien...
    - W
    Non, ce n'est pas de l'histoire ancienne.
    Je me sers quotidiennement de machines neuves Unix avec des processeurs SPARC et d'autres x86, et je peux t'assurer que les problèmes de big-endian / little endian doivent être pris en compte pour chaque programme.

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 295
    Points : 36 792
    Points
    36 792
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Non, ce n'est pas de l'histoire ancienne.
    Je me sers quotidiennement de machines neuves Unix avec des processeurs SPARC et d'autres x86, et je peux t'assurer que les problèmes de big-endian / little endian doivent être pris en compte pour chaque programme.
    Je ne parlais que de l'endianness du PDP-11.
    - W

  18. #18
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Je ne parlais que de l'endianness du PDP-11.
    Les processeurs embarques ARM utilisent le middle-endian dans certaines conditions, donc ce n'est pas encore a mettre aux oubliettes de l'Histoire...

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/01/2008, 14h30
  2. Comment récupérer les informations stockées dans l'imprimante ?
    Par PDelph7 dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 22/01/2008, 10h01
  3. Réponses: 4
    Dernier message: 03/07/2006, 01h30
  4. Récupérer les informations contenus dans un mail
    Par acado dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 17
    Dernier message: 10/04/2006, 14h48
  5. Comment récupérer les adresses WWW dans Internet Explorer ?
    Par chaours dans le forum Web & réseau
    Réponses: 7
    Dernier message: 03/09/2003, 14h27

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