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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 474
    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 474
    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.

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