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 :

Converstion nombre entre [-128,128] à un nombre entre [0,255]


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Converstion nombre entre [-128,128] à un nombre entre [0,255]
    Bonjour,

    La fonction suivante permet de récupérer des informations dans un fichier binaire, puis de les recopier dans un autre fichier, sous forme numérique.
    Les données que je récupère sont des nombres entre 0 et 254.

    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
    void F(){
    FILE * pFile;
    long iteration,block;
     
    char  memblock[70];int xin;
    std::ofstream outfile("New3.txt");
    std::ifstream infile("C:\\Users\\Pierre\\Favorites\\Documents\\Downloads\\Compressed\\openbookultraGG20080915_1_of_1",ios::in|ios::binary|ios::ate);
     
    if(infile.is_open()){
       int a;long o=0;
       while(o<210000){
       infile.read (memblock, 69);
       if((memblock[10]==71)&&(memblock[11]==83)){
       for(int r=0;r<69;r++){
    	a=memblock[r];
    	if(a<0){a=256+a;}
    	outfile<<a<<'\t';
    }outfile<<'\n';
     }
    o=o+1;}
    }
    infile.close();
    }

    Je veux surtout améliorer cette partie là:
    En effet, les données que je récupère sont des nombres entre 0 et 254. Or étant donné que c'est sous forme de "char" que je récupère les données, les nombres seront compris entre -128 et 128. Lorsque c'est négatif, il faut que j'ajoute ce nombre à 256. (pour retrouver qqch entre 0 et 254).

    Existe t il un moyen bcp plus propre pour faire ça? Comme en définissant correctement les types des variables, j'ai essayé par exemple, unsigned int, signed int, short, unsigned char,... mais rien n'y fait

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Si je ne me trompe il existe unsigned char... mais je crois que ce n'est pas portable hors de Windows...
    A me corriger si je dis une bêtise :p

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Si je ne me trompe il existe unsigned char... mais je crois que ce n'est pas portable hors de Windows...
    A me corriger si je dis une bêtise :p
    Totalement, unsigned char est tout à fait portable

    Au PO >> le code ressemble plus à du C qu'a du C++.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Totalement, unsigned char est tout à fait portable
    En voilà une bonne nouvelle!! Merci

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Au fait, dans mon code, on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::ifstream infile("C:\\Users\\Pierre\\Favorites\\Documents\\Downloads\\Compressed\\openbookultraGG20080915_1_of_1",ios::in|ios::binary|ios::ate);
    que signifient les barres verticales: | dans ios::in|ios::binary...?

    merci

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par deubelte Voir le message
    que signifient les bars verticales: | dans ios::in|ios::binary...? merci
    La barre verticale « | » en C et C++ est un OU logique bit à bit. Lorsque l'on passe des flags qui ne peuvent avoir que deux états (actif ou inactif, un peu comme une case à cocher), on utilise généralement pour cela un entier dont chaque bit est attribué à un flag. Chacun de tes paramètres « in », « binary » et autres sont donc des constantes dont la valeur correspond à un et un seul bit en binaire. Par exemple, sous G++

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ios::in     = 8 = 1000b;
    ios::binary = 4 = 0100b;

    Pour faire l'union de toutes ces valeurs individuelles en une seule, on utilise le OU logique. Par contre, un OU ne sert pas, en soi, qu'à gérer les flags, mais à n'importe quelle opération qui le justifie.

  7. #7
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Ok, merci
    mais dans mon cas:
    in::binary

    signifie qu'on ouvre sous plusieurs mode le fichier, entre autre le mode binaire

  8. #8
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Cela signifie que tu l'ouvre en ios::binary et en ios::in.

    Pour reprend obsidian:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    binary ->    1000
    in ->        0100
    binary|in->  1100
    En fouillant dans le code tu pourras voir qu'il y a ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     #define _IOSbinary        0x20
    enum _Openmode
            {    // constants for file opening options
            _Openmask = 0xff};
     
        static const _Openmode in = (_Openmode)0x01;
        static const _Openmode out = (_Openmode)0x02;
        static const _Openmode ate = (_Openmode)0x04;
        static const _Openmode app = (_Openmode)0x08;
        static const _Openmode trunc = (_Openmode)0x10;
        static const _Openmode _Nocreate = (_Openmode)_IOS_Nocreate;
        static const _Openmode _Noreplace = (_Openmode)_IOS_Noreplace;
        static const _Openmode binary = (_Openmode)_IOSbinary;

  9. #9
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    il existe unsigned char
    oui, je sais, mais le problème c'est que j'utilise la fonction read() qui prend en argument un char*. Alors si je prend un unsigned char, le compilateur râle. Je suppose qu'il faut faire un reinterprete cast quelque part, mais je n'ai aucune idée de comment l'utiliser.

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

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

    est-ce que ça compilerait si tu faisais :

    (uc est ta variable de type unsigned char)

  11. #11
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Bravo!! cela semble compiler.

    Alors si on analyse la structure, je déclare un unsigned char.
    Ensuite, tu convertir en (char *), mais pourquoi passer par référence?

    Pourquoi ne pas faire:

    ce qui fonctionne aussi.

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 33
    Par défaut
    L'exemple que j'ai donné est à appliquer lorsque l'on souhaite lire UN SEUL caractère du fichier (ce qui n'est pas ton cas, je l'avais oublié ! )
    Dans ton cas il faut bien sûr faire comme tu as dit .

    Par contre tu dis que je fais un passage par référence : en fait, la fonction read() attend un pointeur sur char donc :
    - je lui donne une adresse d'un unsigned char, que je convertis au format char*,
    ou
    - tu fournis memblock (qui est un tableau d'unsigned char, donc qui est équivalent à un pointeur sur un unsigned char), que tu convertis convenablement par la suite au format char*

    Nous faisons donc tous un passage par ADRESSE et non par référence.

    Youpi, ça marche

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/10/2009, 21h18
  2. Afficher un nombre contenu sur 128 bits
    Par yoyo1811 dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 19/04/2009, 00h23
  3. [Dates] nombre de jours de la semaine entre 2 dates
    Par arkienou dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2007, 19h38
  4. Réponses: 1
    Dernier message: 14/09/2007, 11h09
  5. Réponses: 2
    Dernier message: 13/07/2006, 16h09

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