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

Langage C++ Discussion :

Ecrire un "int" dans un "char*"


Sujet :

Langage C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut Ecrire un "int" dans un "char*"
    Bonjour,

    j'essaie d'écrire un "int" dans un "char*" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int width = 200;
    char* size = (char*)malloc( sizeof(int) );
    memcpy( size, &width, sizeof(int) );
    le problème est que le "char*" est écrit dans l'ordre inverse, je suis obligé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char temp0 = size[0];
    char temp1 = size[1];
    size[0] = size[3];
    size[1] = size[2];
    size[2] = temp1;
    size[3] = temp0;
    Merci

  2. #2
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    C'est que tu es sur un système en Little indian, où les octets des entiers vont du moins significatif au plus significatif. lien wikipédia
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    C'est ce que je pensais, la plupart des systèmes sont en Little endian (Linux, Windows, Mac), je ne comprends pas pourquoi C++ copie l'Int en Big endian sur un système Little endian.

  4. #4
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 381
    Par défaut
    Citation Envoyé par pol2095 Voir le message
    C'est ce que je pensais, la plupart des systèmes sont en Little endian (Linux, Windows, Mac)
    Le fait d'être en little-endian ou big-endian dépend de l'architecture du processeur et de la façon dont les données sont stockées dans des fichiers ou transférées via des protocoles (voir lien wikipédia plus haut). Les systèmes d'exploitation sont donc little-endian ou big-endian en fonction du processeur sur lequel ils tournent. Par exemple sur processeur Motorola, Linux est big-endian, pas little-endian.

    Citation Envoyé par pol2095 Voir le message
    je ne comprends pas pourquoi C++ copie l'Int en Big endian sur un système Little endian.
    Le nombre 12 reste "douze" qu'on l'écrive de gauche à droite (12 : d'abord les dizaines puis les unités) ou qu'on l'écrive de droite à gauche (21 : d'abord les unités, puis les dizaines). Base 16, 10, 2 ou n'importe quoi d'autre, ça revient au même.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    J'ai testé sur mon PC Intel avec Ubuntu et Fedora :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lscpu | grep "Boutisme"
    retourne "Little Endian", ça dépend du CPU

    non, quand on essaie de recupérer l'int via le JNI Android en Java, la valeur n'est pas la même suivant le Boutisme.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    On parle de sérialisation ou de transformer un entier en chaîne de charactères ?
    Si c'est le premier https://bousk.developpez.com/cours/serialisation-bases/
    Si c'est le second std::string s = std::to_string(200);
    Et non pas le médiocre code C présenté.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    On peut se passer de médiocre, on parle de byte array et non de std::string, commentaire minable et sans intérêt.
    Si c'est pour convertir un int en string, ce n'est pas le propos (le second non).
    C'est plus une quesion C que C++.
    Ce que je voudrais savoir : est-ce qu'un int est toujours stocké dans la mémoire en Big Endian ? si c'est le cas c'est facile à résoudre.

  8. #8
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Citation Envoyé par pol2095 Voir le message
    Ce que je voudrais savoir : est-ce qu'un int est toujours stocké dans la mémoire en Big Endian ?
    Non.
    Revisite le lien que je t'ai donné : lien wikipédia
    notamment cette partie : Dans les ordinateurs
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    J'ai trouvé quelque chose d'intéressant ici, ils inversent bien le int en C quand le processeur est Little Endian.
    Je rajoute cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool isLittleEndian(void)
    {
        short int number = 0x1;
        char *numPtr = (char*)&number;
        return (numPtr[0] == 1);
    }

  10. #10
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 757
    Par défaut
    ton code est quand même "mouais" (utilisation de pointeurs, cast, utilisation de la syntaxe tableau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
     
     
    int main()
    {
        unsigned int num = 0x87654321;
     
        std::cout << std::hex << ((num >> 24) & 0xFF) << ":" << ((num >> 16) & 0xFF) << ":" << ((num >> 8) & 0xFF) << ":" << (num & 0xFF) << std::endl;
     
     
        return EXIT_SUCCESS;
    }

  11. #11
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 596
    Par défaut
    Bonjour,

    Je vais me faire houspiller à raison, mais je ne résiste pas à proposer de passer par une simple opération assembleur x86 (via les __asm etc.) : bswap dont l'objectif est d'inverser l'ordre des octets d'un 32 bits ou 64 bits.

    Version habillée c++ : std::byteswap.

    Salutations

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    A partir de C++20, la bibliothèque standard fournit de quoi tester facilement l'endianness https://en.cppreference.com/w/cpp/types/endian

    Tu parles de Java et d'Android : il faut savoir que la JVM est toujours en big endian : https://stackoverflow.com/questions/...nes-endianness
    Si tu veux savoir depuis Java quel est l'endianness du système native sous-jacent, tu peux utiliser https://docs.oracle.com/javase/8/doc...ByteOrder.html

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

Discussions similaires

  1. [VB6]ecrire une chaine de byte dans la base de registre
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 17/12/2008, 10h50
  2. Réponses: 2
    Dernier message: 03/12/2004, 09h27
  3. Ecrire du texte en couleurs dans un composant
    Par wutang dans le forum Composants
    Réponses: 11
    Dernier message: 12/07/2004, 10h55
  4. [langage] Ecrire un bloc de texte dans un fichier
    Par sarahbes dans le forum Langage
    Réponses: 6
    Dernier message: 10/06/2004, 11h40
  5. Réponses: 4
    Dernier message: 23/10/2003, 08h03

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